WPF DataTemplate绑定取决于属性的类型

gmn*_*gmn 18 c# data-binding wpf xaml

我有一组绑定到分层数据模板的对象,我的每个对象都有一个属性(我们称之为属性"A")属于某种类型.这种类型在每个对象之间变化.

如果数据模板包含图像和某些文本,那么根据属性"A"的类型更改模板中显示的图像的最佳方法是什么.

我知道我可以把它放到转换器中并在代码中手动进行绑定转换,但是在WPF中提供了所有绑定工具,我认为这可能是更好的方法.

Rob*_*ney 36

如果您创建本地数据模板并使用a,则在数据模板中执行此操作非常简单ContentPresenter.此模板显示类型的对象MyObject,显示一个图像,其源由显示属性内容的A旁边的属性类型确定:TextBlockText

<DataTemplate DataType="{x:Type MyObject}">
   <StackPanel Orientation="Horizontal">
      <StackPanel.Resources>
         <DataTemplate DataType="{x:Type Thing1}">
            <Image Source="thing1.png"/>
         </DataTemplate>
         <DataTemplate DataType="{x:Type Thing2}">
            <Image Source="thing2.png"/>
         </DataTemplate>
      </StackPanel.Resources>
      <ContentPresenter Content="{Binding A}"/>
      <TextBlock Text="{Binding Text}"/>
   </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

如果要使用样式要做到这一点,而不是,你会碰到一个问题,因为数据触发器想看看属性值,和类型的的A财产不是本身,暴露的属性.

当然,除非你实施一个:

public Type AType { get { return A.GetType(); } }
Run Code Online (Sandbox Code Playgroud)

(您还需要提高PropertyChangedAType的当值A的变化.)一旦你这样做,你应该能够实现一种风格,例如数据触发:

<Style TargetType="Image">
   <Setter Property="Source" Value="default.png"/>
   <Style.Triggers>
      <DataTrigger Binding="{Binding AType}" Value="{x:Type Thing1}">
         <Setter Property="Source" Value="thing1.png"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding AType}" Value="{x:Type Thing2}">
         <Setter Property="Source" Value="thing2.png"/>
      </DataTrigger>
   </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)