我正在试图弄清楚如何执行以下操作:
我的CustomerListViewModel
包含ObservableCollection<Customer>
MainView
包含这些视图的实例:
CustomerListView
- 创建CustomerListViewModel
SearchView
- 创建SearchViewModel
我的问题是,如何保持CustomerListView和SearchView分开。
只有在选择了客户时才应显示SearchView。 SearchViewModel的唯一依赖项应该是Customer
模型。如果没有从CustomerListViewModel中选择Customer,则不应显示SearchView。
我是否应该引入一个包含CustomerListViewModel
和SearchViewModel
的新View / ViewModel,它可以保存对Selected Customer
的引用并切换SearchView的显示?如果没有,我该怎么办呢?
我知道这个问题非常广泛,但我会很感激任何建议。
答案 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的复合应用程序库的指南。这是一个非常简洁的库,但对于小型项目,它可能超大。