我在这里咬了一大块,试图同时学习 MVVM、Unity 和 Prism(ack!)。到目前为止,一切都还算顺利,但我时不时会遇到绊脚石。其中之一是:
我有一个定义主从屏幕的虚拟机。在详细信息部分,我想在选项卡控件上跨多个 DataGrid 划分详细信息行。每个 DataGrid 都包含基于行(“Section”)中的属性值的详细信息行的不同子集。因此,基本上,我阅读了包含详细实体集合的主实体。而且我认为我需要将此集合的不同 View 公开给 View ,以便 DataGrid 可以各自绑定(bind)到详细信息集合的正确过滤子集。 DataGrids 必须是可编辑的。我已经尝试将各种级别的 CollectionViews 作为 DataGrids 的 ItemsSources 公开,但似乎没有任何工作正常。另外,我认为最好将 DataGrids 分解为通用 View ,因为它们都显示相同的信息(只是在不同的细节子集上),但我不知道该怎么做。任何人都可以帮忙吗?
谢谢,
丹尼斯
最佳答案
如果我正确理解你,你有这样的事情:
public class MasterClass
{
public List<object> Details;
}
在哪里
Details
是一个包含许多不同类型对象的List,并且您想为每种类型的对象显示不同的 View (DataGrid)?我会使用
TabControl
它是 ItemsSource
绑定(bind)到 Details
属性,然后使用 DataTrigger
在 TabItem 中确定应如何绘制 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 的模板。是“地址”或“电话”。我过去也使用 Converter 来检查对象的类型,而不是需要在对象上具有 Type 属性,这样效果更好。如果你有兴趣,我写了一篇简短的文章here显示了几种基于 ViewModel 数据切换 View 或用户控件的方法
关于MVVM ViewModel 暴露同一集合的多个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944327/