我有一组绑定到分层数据模板的对象,我的每个对象都有一个属性(我们称之为属性“A”)属于某种类型。这种类型在每个对象中都有所不同。
如果数据模板包含图像和某些文本,那么根据属性“A”的类型更改模板中显示的图像的最佳方法是什么。
我知道我可以将其粘贴到转换器中并在代码中手动执行绑定转换,但是在WPF中提供了所有绑定工具,我认为这可能是更好的方法。
答案 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>
没有测试过,但想法就是这样。