MVVM ViewModel公开同一集合的多个视图

时间:2011-08-04 15:35:45

标签: mvvm collections view

我正在咬一大块,试图一下子学习MVVM,Unity和Prism(确认!)。到目前为止,它已经相当不错了,但我时不时遇到绊脚石。其中之一是:

我有一个定义主细节屏幕的VM。在详细信息部分中,我想在选项卡控件上划分多个DataGrids上的细节线。每个DataGrid都根据行中属性的值(“Section”)包含细节行的不同子集。基本上,我读了我的主实体,其中包含一系列细节实体。我认为我需要将此集合的不同视图暴露给View,以便DataGrids可以各自绑定到详细信息集合的正确过滤子集。 DataGrids必须是可编辑的。我已经尝试过将各种级别的CollectionViews暴露为DataGrids的ItemsSources,但似乎没有任何工作正常。另外,我认为将DataGrids分解为通用视图可能是最好的,因为它们都显示相同的信息(只是在不同的细节子集上),但我不知道如何做到这一点。有人可以帮忙吗?

谢谢, 丹尼斯

1 个答案:

答案 0 :(得分:0)

如果我正确地理解你,你会有这样的事情:

public class MasterClass
{
    public List<object> Details;
}

其中Details是包含许多不同类型对象的List,并且您希望为每种类型的对象显示不同的View(DataGrid)?

我会使用TabControlItemsSource绑定到Details属性,然后使用TabItem中的DataTrigger来确定ItemTemplate(标签内容)的方式应该被吸引。

有些事情如下:

<TabControl ItemsSource="{Binding Details}">
    <TabControl.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Template" Value="{StaticResource DefaultTemplate}" />
            <Style.Triggers>
                <DataTrigger Property="{Binding ItemType}" Value="Address">
                    <Setter Property="Template" Value="{StaticResource AddressTemplate}" />
                </DataTrigger>
                <DataTrigger Property="{Binding ItemType}" Value="Phone">
                    <Setter Property="Template" Value="{StaticResource PhoneTemplate}" />
                </DataTrigger>
        </Style>
    </TabControl.Resources>
</TabControl>

这只是一个粗略的例子,如果Detail.ItemType是“地址”或“电话”,它将改变TabItem的模板。我过去也使用转换器来检查对象的类型,而不是需要在对象上使用Type属性,这样做效果更好。

如果您有兴趣,我写了一篇简短的文章here,其中显示了基于ViewModel数据切换视图或用户控件的几种方法