如何在MVVM中使用两个用户控件创建Master Detail视图?

时间:2010-10-30 12:19:32

标签: silverlight data-binding mvvm prism

我对如何使用两个不同的用户控件创建主详细信息视图感到困惑。

有三种选择,

选择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吗?

我也在努力学习棱镜,我对如何做到这一点几乎没有什么困惑,任何帮助都会得到满足。

2 个答案:

答案 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实现主/细节场景。