Я согласен с комментарием Уилла, ваша модель представления не должна заботиться или знать, как она отображается, или если дизайнеры когда-нибудь решат изменить способ ее отображения.
ViewModel должен содержать только всю необходимую информацию для слоя представления, чтобы отобразить ее.
Таким образом, у ViewModel должны быть все свойства, с которыми должна работать панель ленты, чтобы функционировать. Затем вы можете использовать Resources.xaml или другую стратегию для его представления.
Сделав снимок в темноте, я бы попробовал что-то подобное для моделей ViewModels:
public interface IMenuViewModel : INotifyPropertyChanged
{
ICommand Command {get;}
string Title {get;}
string Description {get;}
UIType Type {get;}
IList<IMenuViewModel> ChildItems {get;}
}
Я бы тогда, вероятно, создал бы абстрактный класс, который предоставляет реализации INotifyPropertyChanged
с классом коллекции, реализующим INotifyCollectionChanged
для заботы о канале.
Тогда я бы, вероятно, сделал что-то подобное в Resources.xaml
<DataTemplate DataType="{x:Type vm:IMenuViewModel}">
<StackPanel>
<Button Command="{Binding Command}" Content="{Binding Type}"/>
<ItemsControl ItemsSource="{Binding ChildItems}"/>
</StackPanel>
</DataTemplate>
, чтобы обеспечить представление по умолчанию для ваших моделей представления
и затем все, что кто-то должен сделать, чтобы создать запись в вашей ленточной панели, это
1) Реализация IMenuViewModel
2) При желании добавьте еще одну запись DataTemplate в свои resources.xaml, если они хотят, чтобы их виджет отображался по-другому, например:
<DataTemplate DataType="{x:Type vm:FooViewModel}">
<v:FooView />
</DataTemplate>
Надеюсь, я не углубился в то, как я буду реализовывать.
Суть в том, что ViewModel
должен раскрывать только свойства, необходимые для представления, выполняющего свою работу (то есть визуализации ViewModel
), а не для ViewModel
, чтобы выполнять работу или заботиться о том, как это делается.