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实现它。
对以上有什么想法吗?尝试创建我所描述的基础视图或基础视图模型会是个坏主意吗?
谢谢。
您真正要在视图模型中创建继承,而不是在视图中创建继承。我会定义一个ItemViewModelBase
类,它公开ItemName
、Items
和SelectedItemName
属性,并从中派生我的视图模型
视图本身并不是真正的"继承"。事实上,除非你需要在视图中进行自定义,否则你不需要多个视图:你只需要一个显示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中无处不在。
您可以继续使用一个通用视图模型,但可以使用多个数据层。这基本上可以帮助您提高数据层的复杂性基本上更易于测试和调试。但一切都过于依赖上下文。祝你好运