Я попытаюсь упростить задачу, над которой я работаю, представив этот пример:
Предположим, что у нас есть следующая иерархия классов моделей:
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?)
Кто-нибудь может посоветовать другие варианты?
Заранее спасибо!