MVVM ViewModel для просмотра сообщений
МВВМ вопрос. Обмен сообщениями между ViewModel и View, как это лучше всего реализовать?
В приложении есть несколько пунктов "общения с пользователем", таких как: "Вы ввели комментарии для этого выбора. Вы хотите сохранить или отменить ", когда значение выбора Да / Нет / НЗ меняется. Поэтому мне нужен какой-то запрещенный способ привязки View к "сообщениям" ViewModel.
Я пошел по пути, начавшемуся с Messenger Фонда MVVM. Однако это скорее общесистемная трансляция, чем модель события / подписчика. Таким образом, если приложение имеет два экземпляра открытого представления (Person1 EditView и Person2 EditView), они оба получают сообщение, когда один ViewModel публикует сообщение "Вы хотите сохранить".
Какой подход вы использовали?
Спасибо энди
2 ответа
Для всего этого вы должны использовать связывание в качестве метода "общения". Например, подтверждающее сообщение может отображаться или скрываться в зависимости от свойств, установленных в ViewModel.
Вот вид
<Window.Resources>
<BoolToVisibilityConverter x:key="boolToVis" />
</Window.Resources>
<Grid>
<TextBox Text="{Binding Comment, Mode=TwoWay}" />
<TextBlock Visibility="{Binding IsCommentConfirmationShown,
Converter={StaticResource boolToVis}"
Text="Are you sure you want to cancel?" />
<Button Command="CancelCommand" Text="{Binding CancelButtonText}" />
</Grid>
А вот и ваша ViewModel
// for some base ViewModel you've created that implements INotifyPropertyChanged
public MyViewModel : ViewModel
{
//All props trigger property changed notification
//I've ommited the code for doing so for brevity
public string Comment { ... }
public string CancelButtonText { ... }
public bool IsCommentConfirmationShown { ... }
public RelayCommand CancelCommand { ... }
public MyViewModel()
{
CancelButtonText = "Cancel";
IsCommentConfirmationShown = false;
CancelCommand = new RelayCommand(Cancel);
}
public void Cancel()
{
if(Comment != null && !IsCommentConfirmationShown)
{
IsCommentConfirmationShown = true;
CancelButtonText = "Yes";
}
else
{
//perform cancel
}
}
}
Это не полный пример (единственный вариант - да!:)), но, надеюсь, это показывает, что ваш View и ваша ViewModel - это почти одна сущность, а не две, которые звонят друг другу по телефону.
Надеюсь это поможет.
То, что описывает Андерсон, вероятно, достаточно для конкретного требования, которое вы описываете. Тем не менее, вы можете захотеть взглянуть на поведение Expression Blend, которое обеспечивает мощную поддержку взаимодействий между моделями представлений и представлениями, что может быть полезно в более сложных сценариях - использование привязки для 'messages' только поможет вам.
Обратите внимание, что SDK выражения blend доступен бесплатно - вам не нужно использовать Expression Blend для использования SDK или поведения; хотя в Blend IDE лучше встроена поддержка "перетаскивания" поведений.
Также обратите внимание, что каждое "поведение" является компонентом - другими словами, это расширяемая модель; в SDK есть несколько встроенных поведений, но вы можете написать свое собственное поведение.
Вот несколько ссылок. (Обратите внимание, что не позволяйте "серебряному свету" в URL вводить вас в заблуждение - поведение поддерживается как для WPF, так и для Silverlight):