Нужен ли мне контроллер представления для MVVM-light в Silverlight?

У меня есть следующий вопрос относительно света MVVM: что «управляет» пользовательским интерфейсом? Я вижу, что у меня может быть ViewModel для каждого View, который я показываю; ViewLocator обрабатывает все ViewModels (как я понимаю, для кеширования). Но что движет пользовательским интерфейсом?

Если у меня есть команда, определенная в моей ViewModel, которая говорит «ShowDetail»; мне нужно написать код для отображения этого представления внутри ViewModel?

Есть ли этому примеры? Спасибо!


person Stefan de Vogelaere    schedule 19.04.2010    source источник


Ответы (5)


Сам по себе шаблон MVVM не имеет ничего особенного для навигации между представлениями. Хотя для этого есть много решений в разных фреймворках. Наиболее распространенное решение - использовать какой-то контроллер, который «оркестрирует» основное представление, или использовать подход «мастер-детали» для вложенных представлений.

Несколько интересных решений:

  • nRoute, Риши Оберой (Orktane)
  • Magellan, Пол Стовелл
  • Менеджер просмотра Ocean, Карл Шиффлетт
  • "Подход" Джоша Смита
person robertos    schedule 22.04.2010

В MVVM то, что «движет» представлением, - это привязка данных. Вы можете подключить View к ViewModel, установив DataContext View так, чтобы он указывал на модель представления.

Простой пример (с использованием MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase
{
   (...)
   private string _myProperty;
   public string MyProperty {
       get { return _myProperty; }
       set {
           _myProperty = value;
           RaisePropertyChanged("MyProperty");
       }
   }
}

MyView.xaml.cs

void MyView() {
   DataContext = new MyViewModel();
}

MyView.xaml

<TextBlock Text="{Binding MyProperty}" />
person robertos    schedule 19.04.2010
comment
Мои вопросы были больше связаны с загрузкой разных представлений. Я понимаю механизм привязки к ViewModel. Но где мне написать код для отображения нового представления, когда пользователь, например, нажимает кнопку «Показать подробности»? - person Stefan de Vogelaere; 20.04.2010

Я создал шаблон T4, который генерирует код и показывает, как перейти к uri или объекту или закрыть окно (wpf). Работает с мввм светом

Загрузить здесь

person Rick Ratayczak    schedule 01.05.2010

Я бы порекомендовал вам ознакомиться с системой обмена сообщениями в наборе инструментов MVVM light. Это, кажется, самый простой подход, который я нашел для достижения этой цели. Вот пример того, как это работает:

Если у вас есть 2 модели просмотра - одна для поиска клиентов, другая для отображения сведений о выбранном клиенте:

В модели первого представления у вас есть такое свойство:

public string CustomerID
    {
        get
        {
            return _customerid;
        }

        set
        {
            if (_efolderid == value)
            {
                return;
            }

            var oldValue = _customerid;
            _customerid = value;

            // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
            RaisePropertyChanged("CustomerID", oldValue, value, true);
        }
    }

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

    void registerForMessages()
    {
        Messenger.Default.Register<PropertyChangedMessage<string>>(this,
            (pcm) =>
            {
                if (pcm.PropertyName == "CustomerID")
                {
                    customerID = pcm.NewValue;
                    AddWorkplanCommand.RaiseCanExecuteChanged();
                    loadCustomerDetails();
                }
            });
    }

Обязательно вызовите функцию registerForMessages () в конструкторе второй модели представления. Еще одна полезная вещь - создание своеобразной карты, если в вашем приложении 4 или более ViewModels. Я считаю, что легко создать его в быстром текстовом файле в решении, чтобы отслеживать все сообщения и то, для чего они предназначены, а также какие другие модели представления зарегистрированы для их получения.

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

person Ryan from Denver    schedule 19.07.2010

Думаю, вам стоит попробовать Cinch V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

что кажется многообещающим. Однако я думаю, что большинство из этих фреймворков довольно сложны.

Я реализовал решение с простым подходом MVVM с каким-то шаблоном контролирующего контроллера, который обрабатывает связь между представлениями и моделями представлений.

person Kurt De Kempeneer    schedule 15.06.2010