【发布时间】:2011-06-28 11:08:54
【问题描述】:
我将尝试通过想象这个例子来简化我正在处理的任务:
假设我们有以下模型类的层次结构:
Animal
Lion
Snake
Bird
...对应的 ViewModel:
AnimalCollectionViewModel
AnimalViewModel
LionViewModel
SnakeViewModel
BirdViewModel
...以及相应的视图:
AnimalCollectionView
LionView
SnakeView
BirdView
假设 AnimalCollection 包含一个列表,其中填充了不同类型动物的对象,并且在列表下方有一个属性网格,用于设置所选动物的属性。显然,属性网格将具有不同的属性,并且应该在所选项目的类型发生变化时发生变化。
问题是:如何根据MVVM模式实现WPF中属性网格的切换?使用什么机制?
目前,我在基本 ViewModel (AnimalViewModel.PropertyGridType = {Lion, Snake, Bird}) 中有一个抽象枚举属性,派生类通过返回相应的值来实现该属性。 AnimalCollectionView 会根据此属性的值更改属性网格用户控件。像这样的:
...
<UserControl.Resources>
<Style x:Key="PropertyGridStyle" TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding PropertyGridType}" Value="Lion">
<Setter Property="Content">
<Setter.Value>
<view:LionPropertyGridView />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding PropertyGridType}" Value="Snake">
<Setter Property="Content">
<Setter.Value>
<view:SnakePropertyGridView />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ContentControl Style="{StaticResource PropertyGridStyle}" />
...
但我不确定这是否是正确的方法。 (至少我不喜欢引入辅助枚举属性。是否可以根据 ViewModel 类型推导出必要的用户控件?) 有人可以建议其他选择吗? 提前致谢!
【问题讨论】:
-
只要您的视图逻辑与视图分离并使用数据绑定,您就可以轻松地在 mvvm 领域。这样做的主要好处之一是可测试性,所以从一个用例和一些测试开始。然后,您可以根据需要应用不同的 OOP 和 wpf 技术。干杯