Я попытаюсь упростить задачу, над которой я работаю, воображая этот пример:
Предположим, что мы имеем следующую иерархию модельных классов:
Animal
Lion
Snake
Bird
... соответствующие ViewModels:
AnimalCollectionViewModel
AnimalViewModel
LionViewModel
SnakeViewModel
BirdViewModel
... и соответствующие представления:
AnimalCollectionView
LionView
SnakeView
BirdView
Предполагалось, что AnimalCollection содержит список, заполненный объектами разных типов животных, и ниже списка он имеет сетку свойств для задания свойств выбранного животного. Очевидно, сетки свойств будут иметь разные свойства и должны измениться при изменении типа выбранного элемента.
Возникает вопрос: как реализовать коммутацию свойств в WPF в соответствии с шаблоном MVVM? С помощью какого механизма?
В настоящее время у меня есть абстрактное свойство enum в базовом 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}" />
...
Но я не уверен, что это правильный подход. (По крайней мере, мне не нравится вводить вспомогательное свойство enum. Можно ли вывести необходимый пользовательский элемент управления на основе типа ViewModel?) Может ли кто-нибудь посоветовать другие варианты? Спасибо заранее!