我有一个User类和一个扩展User的Author类。我有一个ObservableCollection< User>显示在ListBox中。为此,我有一个DataTemplate来显示每个项目,另一个显示每个选定的项目。我还有一列TextBox,它们绑定到ListBox.SelectedItem属性的属性。到目前为止,非常好。
目前,我在列和DataTemplates中显示额外的控件,如果所选用户是作者并且一切正常,但我在作弊。我已将一个IsAuthor bool属性添加到User类中,以便我可以绑定它并确定User是否是Author。我知道这是错的,但我无法解决任何其他问题,所以我的第一个问题是如何以不同于基类的方式显示扩展类?我为类型Author尝试了不同的DataTemplate,但它从未起作用......也许是因为该集合属于User类型?
第二个问题是我是否应该在UserControl的列中包含所有许多TextBox控件并更改作者相关控件的可见性,或者以某种方式将它们放在DataTemplate中并为每种类型创建一个?我当前正在使用第一种方法,问题是当当前所选项目不是作者时,绑定到Author属性的每个控件都会抛出错误(我可以在Visual Studio的“输出”窗口中看到它们)。
答案 0 :(得分:3)
我有一个类似的设置,它使用数据模板,它可以很好地继承类。这就是我做到的。
<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属性中的键引用它。在确定要为所选项目显示的内容时,内容控件使用其他两个数据模板。当所选项目只是用户时,将显示User DataTemplate,如果选择了作者,则将显示作者DataTemplate。
x:Type local:Author指的是类类型。应在您的名称空间声明中声明local。
xmlns:local="clr-namespace:TestApp"
请记住,这是我的命名空间,您必须指定您正在使用的名称空间。当然,数据模板只是基本的例子,大概你会想要为你的应用程序做一些更适合的事情。
但是,必须为两个类定义两个几乎完全相同的独立数据模板可能会令人恼火。虽然你当然可以。我是在自己的应用程序中完成的(不是在这个例子中),因为我想为每种类型显示的内容都有很大不同。
所以可能有用的是为所有User属性创建一个公共DataTemplate,并简单地为Authors扩展这个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>
正如您所看到的,用户和作者的DataTemplates都使用名为“UserTemplate”的DataTemplate开始。但在作者DataTemplate中,我们将添加作者特定的属性。
我希望有所帮助。