题
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):