繁体   English   中英

WPF MVVM 和视图 inheritance

[英]WPF MVVM and View inheritance

我有大约十几个不同的视图,除了它们绑定的属性的名称之外,它们几乎相同。 例如,以下部分是两种不同的视图:

<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 class 其他视图继承自。 这个基础 class 将使用足够通用的绑定名称,以便可以重用,例如:

<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 继承,仅此而已。 不过,我还必须对 ViewModel 进行更改,以便它们公开正确命名的属性,例如 DataItem。 我想我可以创建一个基本的 ViewModel 接口来公开所需的属性并让其他 ViewModel 实现它。

对上述有什么想法吗? 如我所述,尝试创建基本视图或基本视图 model 是不是一个坏主意?

谢谢。

你真的要在你的视图模型中创建 inheritance,而不是你的视图。 我将定义一个ItemViewModelBase class 公开ItemNameItemsSelectedItemName属性并从中派生我的视图模型。

观点本身并没有真正“继承”。 实际上,除非您需要在视图中进行自定义,否则您不需要多个视图:您只需要一个呈现ItemViewModelBase对象的视图。

当然,如果您确实需要不同的视图,您可以进行一定程度的自定义,例如:

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

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

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

这并不比重写ToString()以返回ItemName (这是我开始的地方)更容易,但是如果(例如)您想要一个在用户将鼠标悬停在其上时显示详细信息的ToolTip ,您只需将其添加到这个模板,它可以在您的 UI 中随处使用。

可能您可以继续拥有一个通用视图 model,但拥有多个数据层。 这基本上可以帮助您在数据层上推复杂度,这基本上更容易测试和调试。 但是一切都太依赖上下文了。 祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM