Вопрос

Вопрос MVVM.Обмен сообщениями между ViewModel и View, как это лучше всего реализовать?

В приложении есть некоторые моменты “общения с пользователем”, такие как:“Вы ввели комментарии к этому выбору.Хотите ли вы сохранить или отменить”, когда изменяется значение выбора "Да" / "Нет" / NA.Итак, мне нужен какой-то запрещенный способ привязки представления к “сообщениям” ViewModel .

Я пошел по пути, начавшемуся с Мессенджера Фонда MVVM.Однако это скорее общесистемная трансляция, чем модель событие / подписчик.Итак, если в приложении открыто два экземпляра представления (Person1 EditView и Person2 EditView), они оба получают сообщение, когда одна ViewModel публикует сообщение "вы хотите сохранить".

Какой подход вы использовали?

Спасибо Энди

Это было полезно?

Решение

Для всего этого вы бы использовали привязку в качестве вашего метода для "общения".Например, сообщение с подтверждением может быть отображено или скрыто в зависимости от свойств, установленных в вашей 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
          }
     }
}

Это не полный образец (единственный вариант - да!:)), но, надеюсь, это иллюстрирует, что ваше представление и ваша ViewModel - это почти одна сущность, а не две, которые совершают телефонные звонки друг другу.

Надеюсь, это поможет.

Другие советы

То, что описывает Андерсон, вероятно, достаточно для конкретного требования, которое вы описываете.Однако, возможно, вы захотите изучить Поведение Смешивания выражений которые обеспечивают мощную поддержку взаимодействий между моделями представлений и views, что может быть полезно в более сложных сценариях - использование привязки для "сообщений" приведет вас только к этому.

Обратите внимание, что expression blend SDK находится в свободном доступе - вам не обязательно использовать Expression Blend для использования SDK или поведения;хотя Blend IDE имеет лучшую встроенную поддержку для "перетаскивания" поведений.

Также обратите внимание, что каждое "поведение" является компонентом - другими словами, это расширяемая модель;в SDK есть несколько встроенных моделей поведения, но вы можете написать свое собственное поведение.

Вот несколько ссылок.(Обратите внимание, не позволяйте 'silverlight' в URL ввести вас в заблуждение - поведение поддерживается как для WPF, так и для Silverlight):

Информация

Смешать SDK

видео о поведении

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top