我有一个类似的设置,它使用数据模板,它适用于继承的类。我就是这样做的。
<ListBox Name="UserList" ItemsSource="{Binding Path=Users}"
ItemTemplate="{StaticResource ShowUserName}"
SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}">
</ListBox>
<ContentControl Content="{Binding ElementName=UserList, Path=SelectedItem}"/>
在 Window.Resources 部分中,我有以下 DataTemplates:
<DataTemplate x:Key="ShowTime" DataType="TestApp.User">
<TextBlock Text="{Binding Path=Name}" HorizontalAlignment="Center"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:User}">
<StackPanel Margin="10">
<TextBlock Text="{Binding Path=Name}"/>
<TextBlock Text="{Binding Path=Age}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Author}">
<StackPanel Margin="10">
<TextBlock Text="{Binding Path=Name}"/>
<TextBlock Text="{Binding Path=Age}"/>
<TextBlock Text="{Binding Path=FirstTitle}"/>
</StackPanel>
</DataTemplate>
第一个模板将显示在列表本身中。我们在列表框的 ItemTemplate 属性中通过键引用它。其他两个数据模板由内容控件在确定为所选项目显示什么时使用。当所选项目只是用户时,将显示用户数据转换,如果选择了作者,则将显示作者数据模式。
x:Type local:Author 指的是类类型。local 应该在你的命名空间声明中声明。
xmlns:local="clr-namespace:TestApp"
请记住,这是我的命名空间,您必须指定您正在使用的命名空间。当然,数据模板只是基本示例,大概您会想要做一些更适合您的应用程序的事情。
但是,必须为两个类定义几乎完全相同的两个单独的数据模板可能会很烦人。虽然你当然可以。我在我自己的应用程序中执行此操作(不在此示例中),因为我想为每种类型显示的内容大不相同。
因此,可能有用的是为所有用户属性创建一个公共 DataTemplate,并简单地为作者扩展这个 DataTemplate。如果你想这样做,你可以这样设置你的模板:
<DataTemplate x:Key="UserTemplate">
<!-- show all the properties of the user class here -->
</DataTemplate>
<DataTemplate DataType="{x:Type local:User}">
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource UserTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Author}">
<StackPanel>
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource UserTemplate}"/>
<!-- show all the additional Author properties here -->
</StackPanel>
</DataTemplate>
如您所见,User 和 Author 的 DataTemplate 都开始使用名为“UserTemplate”的 DataTemplate。但是在作者数据模板中,我们将添加作者特定的属性。
我希望这会有所帮助。