我有十几个不同的视图,除了它们绑定的属性的名称之外几乎完全相同.例如,以下部分形成两个不同的视图:
<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}"
Run Code Online (Sandbox Code Playgroud)
请注意,这些块之间唯一的真正区别是使用的绑定的名称(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}"
Run Code Online (Sandbox Code Playgroud)
这样,我的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>
Run Code Online (Sandbox Code Playgroud)
出于另一个原因,这是一个很酷的主意.现在,如果您不提供数据模板,只要WPF显示一个对象,它就会创建一个TextBlock包含object.ToString().实现通用基类为您提供了一种仅通过创建一个数据模板来全局覆盖此行为的方法,例如:
<DataTemplate DataType="{x:Type ItemViewModelBase}">
<TextBlock Text="{Binding ItemName}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
这不仅仅是覆盖ToString()返回更容易ItemName(这是我开始的地方),但是如果(例如)你希望ToolTip当用户将鼠标放在它上面时显示详细信息,你只需将它添加到这个模板中它就可以在任何地方工作在你的UI中.
| 归档时间: |
|
| 查看次数: |
4894 次 |
| 最近记录: |