У меня есть следующий вопрос относительно светового сигнала MVVM: что "управляет" UI? Я вижу, что у меня может быть ViewModel на Представление, которое я показываю; ViewLocator обрабатывает весь ViewModels (для кэширования, как я понимаю). Но что управляет UI?
Если мне определили Команду в моем ViewModel, который заявляет "ShowDetail"; я должен написать код для отображения этого Представления в ViewModel?
Есть ли какие-либо примеры этого?Спасибо!
В 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}" />
Сам по себе шаблон MVVM не имеет ничего особенного для навигации между представлениями. Хотя для этого есть много решений в нескольких фреймворках. Наиболее распространенное решение - использовать какой-то контроллер, который "оркестрирует" основное представление, или использовать подход "Master-Detail" для вложенных представлений.
Некоторые интересные решения:
Я создал шаблон T4, который генерирует код и показывает, как перейти к uri или объекту или закрыть окно (wpf). Он работает с mvvm light
Думаю, вы могли бы попробовать Cinch V2:
http://www.codeproject.com/KB/WPF/CinchV2_1.aspx
, что кажется довольно многообещающим. Однако я думаю, что большинство этих фреймворков довольно сложны.
Я реализовал решение с простым подходом MVVM с каким-то шаблоном контролирующего контроллера, который управляет обменом данными между представлениями и моделями представлений.
Я бы порекомендовал вам ознакомиться с системой обмена сообщениями в наборе инструментов 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, и сразу же 4 другие модели просмотра получают это изменение и все начинают загружать изменения сами.