WPF MVVM和视图继承

本文关键字:继承 视图 MVVM WPF | 更新日期: 2023-09-27 18:00:51

我有大约十几个不同的视图,除了它们绑定的属性的名称之外,它们几乎完全相同

<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}"

请注意,这些to块之间唯一真正的区别是使用的绑定的名称(Person与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实现它。

对以上有什么想法吗?尝试创建我所描述的基础视图或基础视图模型会是个坏主意吗?

谢谢。

WPF MVVM和视图继承

您真正要在视图模型中创建继承,而不是在视图中创建继承。我会定义一个ItemViewModelBase类,它公开ItemNameItemsSelectedItemName属性,并从中派生我的视图模型

视图本身并不是真正的"继承"。事实上,除非你需要在视图中进行自定义,否则你不需要多个视图:你只需要一个显示ItemViewModelBase对象的视图。

当然,如果你确实需要不同的视图,你可以进行一定量的定制,例如:

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

这是一个很酷的想法,还有另一个原因。现在,如果不提供数据模板,每当WPF呈现对象时,它都会创建一个包含object.ToString()TextBlock。实现一个通用基类可以通过创建一个数据模板来全局覆盖这种行为,例如:

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

这并不比重写ToString()以返回ItemName(这是我的起点(更容易,但如果(例如(你想要一个ToolTip,当用户鼠标悬停在它上面时显示详细信息,你只需将它添加到这个模板中,它就可以在你的UI中无处不在。

您可以继续使用一个通用视图模型,但可以使用多个数据层。这基本上可以帮助您提高数据层的复杂性基本上更易于测试和调试。但一切都过于依赖上下文。祝你好运