我非常相信MVVM,但我不相信创建视图模型,除非有必要。只要模型对象正确地支持更改通知,并且视图没有视图状态,就可以直接使用模型对象。
以下是我几年前为解决这个问题而写的:
<ListView ItemsSource="{Binding AllSelections}">
<ListView.View>
<GridView>
<!-- First column -->
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding}">
<GridViewColumn.CellTemplate>
<DataTemplate>
<DataTemplate.Resources>
<!-- First column content for ContactModel objects -->
<DataTemplate DataType="{x:Type local:ContactModel}">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
<!-- First column content for NoteModel objects -->
<DataTemplate DataType="{x:Type local:NoteModel}">
<TextBlock Text="{Binding Title}" />
</DataTemplate>
...
</DataTemplate.Resources>
<!-- This selects one of the above templates and applies it -->
<ContentPresenter />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- Second column -->
<GridViewColumn ...>
...
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
其中,“AllSelections”是ViewModel中的一个属性,它包含一个ICollection,该ICollection包含ContactModel、NoteModel和ReminderModel对象的混合体,还实现INotifyCollectionChanged。
这种实现视图的方法非常清晰,可以方便地自定义各种对象类型的表示。
<!-- First column -->
<GridViewColumn Header="Title"
DisplayMemberBinding="{edf:ExpressionBinding
context is local:ContactModel ? Name : Title}" />
<!-- Second column -->
<GridViewColumn ... />
我希望不久能发布我的图书馆给其他人使用,或者你也可以自己写。同时,使用多个数据模板的解决方案比创建ViewModel并在其中镜像属性要干净得多。