WPF MVVM и просмотр наследования - PullRequest
3 голосов
/ 02 июля 2011

У меня есть около дюжины различных представлений, которые в значительной степени идентичны, за исключением названий свойств, с которыми они связаны. Например, следующие разделы представляют собой два разных вида:

<TextBlock Text="{Binding PersonName}">       
<GroupBox Header="{Binding PersonName}">
  <ComboBox Text="{Binding SelectedPersonName}" SelectedItem="{Binding SelectedPerson}" ItemsSource="{Binding People}" DisplayMemberPath="PersonName"/>
</GroupBox>
<igDP:XamDataGrid DataSource="{Binding PersonEntries}"


<TextBlock Text="{Binding CarName}">       
<GroupBox Header="{Binding CarName}">
  <ComboBox Text="{Binding SelectedCarName}" SelectedItem="{Binding SelectedCar}" ItemsSource="{Binding Cars}" DisplayMemberPath="CarName"/>
</GroupBox>
<igDP:XamDataGrid DataSource="{Binding CarEntries}"

Обратите внимание, что единственными реальными различиями между этими блоками являются имена используемых привязок (Person vs Car).

Я думал о создании одного класса BaseView, от которого наследуются другие представления. Этот базовый класс будет использовать достаточно общие имена привязок, чтобы его можно было повторно использовать, например:

<TextBlock Text="{Binding DataItemName}">       
<GroupBox Header="{Binding DataItemName}">
  <ComboBox Text="{Binding SelectedDataItemName}" SelectedItem="{Binding SelectedDataItem}" ItemsSource="{Binding DataItems}" DisplayMemberPath="DataItemName"/>
</GroupBox>
<igDP:XamDataGrid DataSource="{Binding DataItemEntries}"

Таким образом, мои PersonsView и CarsView могут наследоваться от BaseView и все. Я также должен был бы внести изменения в ViewModels, чтобы они отображали правильно названные свойства, такие как DataItem. Я думаю, я мог бы создать базовый интерфейс ViewModel, который предоставляет нужные свойства и чтобы другие ViewModel реализовали это.

Есть мысли по поводу вышеизложенного? Будет ли плохой идеей попытаться создать базовый вид или модель базового вида, как я описал?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 03 июля 2011

Вы действительно собираетесь создавать наследование в моделях представления, а не в представлениях. Я бы определил класс ItemViewModelBase, который выставляет свойства ItemName, Items и SelectedItemName и извлекал бы из него мои модели представлений.

Сами по себе взгляды на самом деле не "наследуют". На самом деле, если вам не нужна настройка в представлении, вам не нужно несколько представлений: вам нужен только один вид, представляющий ItemViewModelBase объекты.

Конечно, если вам нужно, чтобы представления были другими, вы можете выполнить определенную настройку, например ::

<DataTemplate DataType="{x:Type CarsViewModel}">
   <DockPanel>
      <Label DockPanel.Dock="Top">Cars</Label>
      <local:ItemView/>
   </DockPanel>
</DataTemplate>

Это классная идея по другой причине. Прямо сейчас, если вы не предоставите шаблон данных, всякий раз, когда WPF представляет объект, он создает TextBlock, содержащий object.ToString(). Реализация базового базового класса дает вам возможность глобально переопределить это поведение, просто создав один шаблон данных, например ::

<DataTemplate DataType="{x:Type ItemViewModelBase}">
   <TextBlock Text="{Binding ItemName}"/>
</DataTemplate>

Это не проще, чем просто переопределить ToString(), чтобы вернуть ItemName (это то, с чего я бы начал), но если (например) вы хотите ToolTip, который отображает подробную информацию, когда пользователь наводит на нее курсор, Вы просто добавляете его в этот шаблон, и он работает везде в вашем пользовательском интерфейсе.

1 голос
/ 03 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...