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

时间:2011-02-15 22:54:49

标签: c# wpf xaml data-binding

我有一组绑定到分层数据模板的对象,我的每个对象都有一个属性(我们称之为属性“A”)属于某种类型。这种类型在每个对象中都有所不同。

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

我知道我可以将其粘贴到转换器中并在代码中手动执行绑定转换,但是在WPF中提供了所有绑定工具,我认为这可能是更好的方法。

3 个答案:

答案 0 :(得分:34)

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

<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>

如果你想使用样式代替这样做,那么你将遇到问题,因为数据触发器想要查看属性值,以及{{1>}的类型 } property本身不作为属性公开。

当然,除非你实施一个:

A

(当public Type AType { get { return A.GetType(); } } 的值发生变化时,您还需要为PropertyChanged提升AType。)完成此操作后,您应该能够实现数据触发器一种风格,例如:

A

答案 1 :(得分:1)

我认为你可以用triggers做到这一点。

<Image.Style>
    <Style TargetType="{x:Type Image}">
        <Setter Property="Source" Value="Path">
        <Style.Triggers>
            <DataTrigger Binding="{Binding TheProperty}" Value="TheValue">
                <Setter Property="Source" Value="NewPath"/>
            </DataTrigger>
        </Style.Triggers>
     </Style>
</Image.Style>

答案 2 :(得分:1)

DataTemplateSelector似乎不是一个好选择,因为A的所有值都有相同的模板。

使用DataTriggers

<DataTemplate>
    <StackPanel>
        <Image x:Name="image" />
        <TextBlock>Your text</TextBlock>
    </StackPanel>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=A}" Value="ValueToCheck1">
            <DataTrigger.Setters>
                <Setter Property="Source" Value="Image1.png" TargetName="image" />
            </DataTrigger.Setters>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=A}" Value="ValueToCheck2">
            <DataTrigger.Setters>
                <Setter Property="Source" Value="Image2.png" TargetName="image" />
            </DataTrigger.Setters>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

没有测试过,但想法就是这样。