MVVM - 分离视图之间的通信

时间:2011-06-08 15:18:45

标签: wpf mvvm

我正在试图弄清楚如何执行以下操作:

我的CustomerListViewModel包含ObservableCollection<Customer>

MainView包含这些视图的实例:

  • CustomerListView - 创建CustomerListViewModel
  • 的实例
  • SearchView - 创建SearchViewModel
  • 的实例

我的问题是,如何保持CustomerListView和SearchView分开。 只有在选择了客户时才应显示SearchView。 SearchViewModel的唯一依赖项应该是Customer模型。如果没有从CustomerListViewModel中选择Customer,则不应显示SearchView。

我是否应该引入一个包含CustomerListViewModelSearchViewModel的新View / ViewModel,它可以保存对Selected Customer的引用并切换SearchView的显示?如果没有,我该怎么办呢?

我知道这个问题非常广泛,但我会很感激任何建议。

4 个答案:

答案 0 :(得分:4)

不要让MainView包含CustomerListView和SearchView的实例。所有这三个都应该是分开的。

就视图之间的通信而言,这应该通过使用例如mvvm-light messenger的相应视图模型来完成。如果您为每个视图注册了不同的信使,那么从视图模型中,您可以将信息发送到您想要的任何视图。

只是使用MVVMLight Messenger简单性的一个例子: -

查看:

Messenger.Default.Register<NotificationMessage>(this, OpenViewMessageReceived);

private void OpenViewMessageReceived(NotificationMessage msg)
{
    //Logic 
}

视图模型:

Messenger.Default.Send(new NotificationMessage(someStr));

答案 1 :(得分:1)

我最近写了一些涉及here的内容。您可能有兴趣查看它。

基本上,如果你可以从RelativeSource Binding访问你的值,这可能是最简单的方法

{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainView}}, Path=DataContext.CustomerListViewModel.SelectedCustomer}

这样的东西

或者实现一个消息传递系统,它会在SelectedCustomer发生更改时广播消息。 MVVM Light Toolkit有一个很简单的使用Messenger类,或者Prism有更高级的EventAggregator

答案 2 :(得分:1)

以下是关于MVVM中视图之间通信的好文章:Communication Between Views in MVVM (Pub-Sub Pattern)

答案 3 :(得分:0)

如果不是为您“过度杀戮”,您可以结帐PRISM

这是使用MVVM和MEF的复合应用程序库的指南。这是一个非常简洁的库,但对于小型项目,它可能超大。