MVVM и списки окон - PullRequest
       9

MVVM и списки окон

0 голосов
/ 10 мая 2009

Я пишу приложение, которое позволяет пользователям просматривать данные, и я хочу использовать стиль пользовательского интерфейса FireFox: позволить пользователю открывать столько окон, сколько они хотят, в каждом из которых есть столько вкладок, сколько они хотят. Я также хочу попытаться сделать это, используя модель Model-View-ViewModel, насколько это возможно.

Открытие новой вкладки должно быть достаточно простым для обработки в MVVM. Создайте ObservableCollection для TabViewModel, привяжите эту коллекцию к ItemsSource элемента TabControl, а затем открыть новую вкладку теоретически так же просто, как добавить новую TabViewModel в коллекцию.

Вот вопрос, который меня интересует: есть ли способ сделать то же самое для открытия нового окна ? То есть, связать ObservableCollection WindowViewModel с ItemsSource of ... коллекции Windows приложения? ... так, чтобы, когда я добавляю новую WindowViewModel в наблюдаемую коллекцию, автоматически открывается новое окно? А затем привяжите это к запуску приложения, чтобы вместо настройки StartupUri я просто добавил первый WindowViewModel в коллекцию?

Так как я не могу на самом деле привязать данные Application.Windows, что будет лучшим способом для слоя ViewModel:

  1. Добавить новую WindowViewModel и автоматически отобразить новое окно;
  2. Удалите WindowViewModel и автоматически закройте его окно.
  3. Удалите WindowViewModel из коллекции, если пользователь закрывает окно.

Я мог бы написать свой собственный объект, который наблюдает за INotifyCollectionChanged и открывает / закрывает окна в ответ на события сбора, но я не уверен, является ли это лучшим способом - и если это так, я не уверен в лучшем способ подключить его в приложение. У кого-нибудь есть мысли о том, как лучше это сделать?

1 Ответ

0 голосов
/ 10 мая 2009

Смысл MVVM в том, что ViewModel не не должен относиться к себе (подробно) с как View будет реагировать на изменения в ViewModel.

Одной из возможностей может быть простой алгоритм отслеживания в View, прослушивающий событие CollectionChanged в ViewModel, создающий и разрушающий Windows на ходу:

Dictionary<WindowModel, WindowView> _cache = new;
void WindowModelListChangedHandler(sender, args) {
    switch(args.Action) {
        case Add:
            _cache[args.NewItem] = new WindowView(args.NewItem);
            _cache[args.NewItem].Show();
            break;
        case Remove:
            // ...
    }    
}
...