2

我有一个用户类和一个扩展用户的作者类。我有一个 ObservableCollection<User> 显示在 ListBox 中。为此,我有一个 DataTemplate 来显示每个项目,另一个来显示每个选定的项目。我还有一列绑定到 ListBox.SelectedItem 属性的文本框。到现在为止还挺好。

目前,如果所选用户是作者,我将在列和 DataTemplates 中显示额外的控件,并且一切正常,但我在作弊。我在 User 类中添加了一个 IsAuthor bool 属性,以便我可以绑定到它并确定用户是否是作者。我知道这是错误的,但我想不出任何其他方法来做到这一点,所以我的第一个问题是如何以不同于基类的方式显示扩展类?我为 Author 类型尝试了不同的 DataTemplate,但它从来没有工作过……也许是因为集合是 User 类型的?

第二个问题是我应该在 UserControl 的列中拥有所有 TextBox 控件并更改作者相关控件的可见性,还是以某种方式将它们放入 DataTemplate 并为每种类型创建一个?我目前使用的是第一种方法,问题是当当前选定的项目不是作者时,绑定到作者属性的每个控件都会引发错误(我可以在 Visual Studio 的输出窗口中看到它们)。

4

1 回答 1

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 属性中通过键引用它。其他两个数据模板由内容控件在确定为所选项目显示什么时使用。当所选项目只是用户时,将显示用户数据转换,如果选择了作者,则将显示作者数据模式。

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。但是在作者数据模板中,我们将添加作者特定的属性。

我希望这会有所帮助。

于 2010-12-14T01:26:28.707 回答