我对如何使用两个不同的用户控件创建主详细信息视图感到困惑。
有三种选择,
选择1
CustomerMasterView + CustomerMasterViewModel
CustomerDetailView + CustomerDetailViewModel
并在App.Resources中保留两个View Models
但是通过这样做,绑定变得与所有静态资源源标记代码变得复杂。
选择2
CustomerViewModel
CustomerMasterView
CustomerDetailView
两个视图通过App.Resources共享相同的ViewModel,即使绑定代码包含太多项目也是如此。
选择3
CustomerMasterView + CustomerMasterViewModel
CustomerDetailView + CustomerDetailViewModel
两个视图都将DataContext设置为其对应的ViewModel。现在这是一个小问题, CustomerMasterView具有Selector(ListBox或DataGrid或其他),其SelectedItem需要绑定到CustomerDetailViewModel的“Customer”属性作为双向绑定。
看起来不错吗?
<!-- CustomerMasterView -->
<ListBox
ItemsSource="{Binding CustomerList}"
SelectedItem="{Binding DataContext.Customer,ElementName=customerDetailView}"
/>
<local:CustomerDetailView
x:Name="customerDetailView"
/>
但是通过这样做,我违背了ViewModel的目的,因为它在我的UI代码中添加了更多的依赖。
哪一个是最喜欢的方式还是有其他方式? 我应该创建嵌套的View Models吗?
我也在努力学习棱镜,我对如何做到这一点几乎没有什么困惑,任何帮助都会得到满足。
答案 0 :(得分:2)
在我看来,最简单的appraoch将是一个具有两个UserControls的单一视图模型。
您的ViewModel将包含您的客户列表,以及“ActiveCustomer”或“SelectedCustomer”。您的MasterView(将DataContext设置为ViewModel)将包含您的列表,如下所示:
<ListBox ItemsSource="{Binding Customers}" SelectedItem="{Binding ActiveItem, Mode=TwoWay}" />
您的MasterView还将包含您的DetailsView(另一个UserControl)。它看起来像这样:
<views:DetailsUserControl DataContext="{Binding ActiveItem}" />
答案 1 :(得分:0)
您可能对 WPF Application Framework (WAF) 的 BookLibrary 示例应用感兴趣。它显示了如何使用两个视图(单独的UserControls)和两个ViewModel实现主/细节场景。