Я твердо верю в MVVM, но я не верю в создание моделей представлений, кроме случаев, когда это необходимо.Пока ваши объекты модели должным образом поддерживают уведомление об изменениях, а ваше представление не имеет состояния просмотра, вы можете напрямую использовать объекты модели.Ваш ListView может напрямую связываться с моделями без каких-либо проблем, поэтому я бы так и поступил.
Вот что я бы написал несколько лет назад, чтобы решить эту проблему:
<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, которая включает в себя смесь объектов ContactModel, NoteModel и ReminderModel, а также реализует INotifyCollectionChanged.
Этот способ реализации представления довольно понятен и упрощает егочтобы настроить представление различных типов объектов.
Сегодня я использую написанную мной библиотеку Emerald Data Foundation, которая значительно упрощает переключение имени свойства источника на основе класса:
<!-- First column -->
<GridViewColumn Header="Title"
DisplayMemberBinding="{edf:ExpressionBinding
context is local:ContactModel ? Name : Title}" />
<!-- Second column -->
<GridViewColumn ... />
Я надеюсь вскоре выпустить мою библиотеку для использования другими, или вы могли бы написать свою собственную.В то же время решение с несколькими DataTemplates работает и намного чище, чем создание ViewModel и зеркалирование ваших свойств в нем.