MVVM问题。 视图模型和视图之间的消息传递,它是如何实现的最好?

在应用程序的“用户通信”一些点,如:“你已经为这个选择而进入评论。您是否希望保存或放弃”的时候是/否/ NA选择的值发生变化。 所以,我需要查看绑定到视图模型的“信息”的一些被禁止的方式。

我下楼路径开始MVVM基金会的使者。然而这是一个更加全系统广播然后一个事件/订户模型。因此,如果应用程序有一个视图的两个实例(PERSON1 EditView中和PERSON2 EditView中)打开他们都得到了消息,当一个视图模型出版了“你要保存”的消息。

什么方法你用过?

由于 安迪

有帮助吗?

解决方案

有关所有这一切,你会使用作为方法结合为“沟通”。例如,可能会显示或基于在您的视图模型设置属性隐藏确认讯息。

这里的视图

<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>

这是您的视图模型

// 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
          }
     }
}

这是不是一个完整的样品(唯一的选择是肯定的!:)),但希望这说明了你的查看和您的视图模型几乎是一个实体,而不是两块互相打电话。

希望这有助于。

其他提示

什么安德森介绍大概是足以让你描述的特定需求。但是,您可能想看看 Expression Blend中行为这对于视图模型和视图之间的相互作用提供了强有力的支持,这可能是比较复杂的情况下非常有用 - 使用“邮件”结合只会让你这么远。

请注意,在Expression Blend的SDK是免费提供的 - 你不必使用Expression Blend中使用SDK或行为;虽然混合IDE确实有关于“拖放”行为的更好的内置支持。

此外,注意每个“行为”是一个组件 - 在其他字它是一个可扩展的模型;有一些内置的SDK的行为,但你可以编写自己的行为。

下面是一些链接。 (注意,不要让你的URL误导“Silverlight的” - 行为都支持WPF和Silverlight):

信息

混合SDK

视频上行为

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top