public BookmarksViewModel()
        {
            _storage = new BookmarksStorage();

            foreach (var bookmark in _storage.Bookmarks)
            {
                var viewModel = new BookmarkViewModel(bookmark);

                viewModel.Deleting += OnBookmarkDeleting;
                viewModel.Editing  += OnBookmarkEditing;

                Bookmarks.Add(viewModel);
            }

            AddBookmarkCommand = new RelayCommand(arg => {
                var bookmarkViewModel = (BookmarkViewModel)arg;

                bookmarkViewModel.Deleting += OnBookmarkDeleting;
                bookmarkViewModel.Editing  += OnBookmarkEditing;

                _storage.Add(bookmarkViewModel.Bookmark);

                Bookmarks.Add(bookmarkViewModel);
            });
        }
        private void OnBookmarkDeleting(object sender, BookmarkViewModel bookmarkViewModel)
        {
            if (MessageBox.Show(UITexts.DeleteBookmarkConfirmation, UITexts.ConfirmationDialogTitle, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                _storage.Remove(bookmarkViewModel.Bookmark);

                Bookmarks.Remove(bookmarkViewModel);

                bookmarkViewModel.Deleting -= OnBookmarkDeleting;
                bookmarkViewModel.Editing  -= OnBookmarkEditing;
            }
        }
        private void OnBookmarkEditing(object sender, BookmarkViewModel bookmarkViewModel)
        {
            var editable = bookmarkViewModel.Clone();

            var dialog = new EditBookmark(editable);

            if (dialog.ShowDialog() == true)
            {
                bookmarkViewModel.FillFrom(editable);

                _storage.Save();
            }
        }
        public MainWindowViewModel(
            BrowserUrl browserUrl)
        {
            _browserUrl = browserUrl ?? throw new ArgumentNullException(nameof(browserUrl));

            ExitCommand = new RelayCommand(
                (arg) => Application.Current.Shutdown()
                );

            Bookmarks = _bookmarksViewModel.Bookmarks;

            _addressCompletionProvider.RegisterProvider(new BookmarksUriProvider(() => _bookmarksViewModel.Bookmarks.Select(b => b.Bookmark)));
            _addressCompletionProvider.RegisterProvider(new AllowedUrisProvider(_browserUrl));

            AddBookmarkCommand = new RelayCommand(
                (arg) =>
            {
                var viewModel = new BookmarkViewModel()
                {
                    Title   = SelectedBrowser.Browser.DocumentTitle,
                    Address = SelectedBrowser.Browser.Source.ToString()
                };

                var dialog = new EditBookmark(viewModel);

                if (dialog.ShowDialog() == true)
                {
                    _bookmarksViewModel.AddBookmarkCommand.Execute(viewModel);
                }
            }
                );

            AddNewTabCommand = new RelayCommand(arg =>
            {
                var viewModel                 = new BrowserViewModel(_browserUrl);
                viewModel.Closing            += OnBrowserTabClosing;
                viewModel.NewWindowRequested += OnNewWindowRequested;

                Browsers.Add(viewModel);

                SelectedBrowser = viewModel;
            });

            SetLanguageCommand = new RelayCommand(arg => {
                var language = (string)arg;

                if (string.IsNullOrWhiteSpace(language) ||
                    CultureInfo.GetCultureInfo(language) == null)
                {
                    Configuration.Language = null;
                }
                else
                {
                    Configuration.Language = language;
                }

                NotifyPropertyChanged(nameof(Language));

                Configuration.SetCurrentCulture();
            });

            _selectedBrowser                     = new BrowserViewModel(_browserUrl);
            _selectedBrowser.Closing            += OnBrowserTabClosing;
            _selectedBrowser.NewWindowRequested += OnNewWindowRequested;

            Browsers.Add(_selectedBrowser);
        }