Использование Microsoft (или другой) ленты с большим проектом и MVVM - PullRequest
8 голосов
/ 06 апреля 2011

Наше приложение представляет собой большой проект с множеством модулей и представлений. В главном окне есть лента, и мы ищем лучший способ интеграции ленты в приложение.

Я создал сервис, который модулирует виды, которые можно зарегистрировать для добавления релевантных для них элементов ленты, и, кроме того, любой экземпляр основного вида может предоставлять свои собственные элементы ленты, относящиеся к этому экземпляру. RibbonItem - это небольшой класс, который абстрагирует параметры элемента ленты и в основном имеет заголовок, описание, команду, UIType и ChildItems. Служба отвечает за восстановление ленты при изменении основного вида.

Мой коллега считает, что это плохо для MVVM, так как пользователям необходимо спроектировать представление ленты в коде C #, а не в XAML, и он также сказал, что таким образом будет трудно отключить или включить группу элементов в один раз, так как каждая команда этих элементов должна будет обновить свое CanExecute отдельно. Вместо этого он предложил иметь основные файлы представлений ленты и ViewModel, где каждому разработчику, который хочет добавить кнопку ленты для своего модуля или представления, потребуется добавить их в XAML-представление View и добавить соответствующую команду в ViewModel. Кроме того, VisualStates будет использоваться для определения того, какие элементы будут отображаться или включаться на основе изменений в ViewModel (таких как изменение представления или изменение выбора). Мне действительно не нравится это решение, в основном потому, что все разработчики должны поместить свои знания модулей в один большой файл.

Обратите внимание, что некоторые элементы на ленте (например, «Опции», «Выход») являются общими для всего приложения, в то время как некоторые относятся к конкретному домену приложения, а некоторые относятся только к определенному представлению.

Редактировать: Наверное, мой главный вопрос: каков рекомендуемый способ интеграции нескольких групп разработчиков на одной ленте? Если у нас есть один RibbonView и один RibbonViewModel, который будет содержать все возможные элементы на ленте, и каждая команда добавит свои элементы к этим V / VM, а также определит логику, когда их показывать (возможно, с помощью визуального состояния) ? Или мы разрешаем каждому представлению, модели представления или модулю регистрировать элементы ленты (в пределах своего собственного кода C #) для службы, и затем служба отображает ленту по мере необходимости, когда активное представление изменяется со всеми элементами, зарегистрированными для этого типа? Или есть ли лучший способ добиться этой интеграции?

Что вы думаете? У вас есть идея или мнение о том, как управлять одним ленточным ресурсом, общим для нескольких разработчиков?

Спасибо, splintor

1 Ответ

1 голос
/ 07 апреля 2011

Я согласен с комментарием Уилла, ваша модель представления не должна заботиться или знать, как она отображается, или если дизайнеры когда-нибудь решат изменить способ ее отображения.

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, чтобы выполнять работу или заботиться о том, как это делается.

...