WPF: Управление окнами (открытие, закрытие и т. Д.) В MVVM? - PullRequest
5 голосов
/ 07 апреля 2011

Я читал об этом в нескольких местах.Большинство людей ссылаются на эти две ссылки:

Я не понимаю ни одного из них.Я начинающий, когда дело доходит до MVVM.Некоторые люди упоминают контроллеры, когда дело доходит до манипулирования окнами в MVVM.Что это такое и как они реализованы?Согласно book , MVVM состоит из модели, модели представления и представления - откуда появляются контроллеры?

Если бы кто-то мог предоставить образец следующего варианта использования, это было бы потрясающе (для всех тех людей, которые только начинают работать с этим, как и я):

  1. Предварительное условие: Окно открыто.
  2. Пользователь нажимает кнопку.
  3. Открывается новое окно, и некоторые данные передаются в это окно, т.е. некоторая строка.
  4. Новое окно закрывается (или нажимается кнопка), и некоторые данные передаются в первое окно.
  5. Переданные данные что-то изменили в окне.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

Если вы не планируете разрешать пользователю переключаться между окнами, когда оба они открыты (т. Е. Первое открывает второе, а второе должно быть закрыто, чтобы вернуться к первому), вы можете просто установите viewmodel для обоих окон на один и тот же экземпляр viewmodel и откройте 2-е окно как модальное, и строки, которые вы передаете взад и вперед, будут просто свойствами модели представления с привязкой данных к чему-либо в представлении.

0 голосов
/ 07 апреля 2011

Связь ViewModel с ViewModel обычно обрабатывается реализацией шаблона Event Aggregator.

MVVM Light использует класс Messenger, Prism имеет другую реализацию, но в основном это один из способов передачи сообщений между моделями представления без связывания.

Есть несколько примеров и Статьи , описывающих использование. Я бы посоветовал взглянуть на это.

Что касается контроллеров в WPF, я не знаю.

По поводу примера:

-У меня есть Windows с ее WindowsViewModel. Этот класс должен иметь команду, привязанную к кнопке.

- Пользователь нажимает кнопку. Выполняет команду.

-Команда открывает новое окно.

Здесь вы должны создать модель диалогового окна и каким-то образом создать окно. Или создайте Окно с помощью ViewModel, но ViewModel не должно много знать о представлении, в противном случае это невозможно проверить.

Мы используем что-то подобное, потому что у нас есть некоторые требования, но это могло бы быть намного проще, это единственный пример, который у меня под рукой:

 bool? ShowDialogImpl<TViewModel>(Action<TViewModel> setup) where TViewModel : ViewModel
        {
            return (bool?)DispatcherHelper.UIDispatcher.Invoke(
                (Func<bool?>)(() =>
                              {
                                  var viewModel = viewModelFactory.Get<TViewModel>();
                                  viewModel.ViewService = this;
                                  setup(viewModel);
                                  var window = new Window
                                               {
                                                   Owner = this,
                                                   SizeToContent = SizeToContent.WidthAndHeight,
                                                   WindowStartupLocation = WindowStartupLocation.CenterOwner,
                                                   Content = ViewFactory.CreateView<TViewModel>(),
                                                   DataContext = viewModel,
                                                   WindowStyle = WindowStyle.ToolWindow,
                                                   ShowInTaskbar = false
                                               };
                                  window.SetBinding(TitleProperty, new Binding("Title"));
                                  openDialogs.Push(window);
                                  window.Activated += (sender, args) => window.SizeToContent = SizeToContent.Manual;
                                  var result = window.ShowDialog();
                                  openDialogs.Pop();
                                  viewModelFactory.Release(viewModel);
                                  return result;
                              }));
        }

В основном: мы создаем окно и модель представления. Модель представления создается на фабрике с использованием контейнера. Установочный делегат Action является точкой входа для наших данных.

  • Сообщение:

Первая Windows это Grid, а вторая Dialog для редактирования данных сетки. В Windows у нас есть:

messenger.Register<EntityUpdated<FooClass>>(this, message => UpdateItem(message.Entity));

А в диалоге:

messenger.Send(new EntityUpdated<FooClass>(subject));

Таким образом, мы знаем, когда что-то было обновлено в диалоге редактирования для обновления сетки.

Надеюсь, это поможет вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...