C# WPF数据模板绑定取决于属性的类型
我有一个绑定到分层数据模板的对象集合,我的每个对象都有一个特定类型的属性(我们称之为属性“a”)。此类型因每个对象而异 如果数据模板包含图像和一些文本,那么根据属性“A”的类型更改模板中显示的图像的最佳方式是什么C# WPF数据模板绑定取决于属性的类型,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我有一个绑定到分层数据模板的对象集合,我的每个对象都有一个特定类型的属性(我们称之为属性“a”)。此类型因每个对象而异 如果数据模板包含图像和一些文本,那么根据属性“A”的类型更改模板中显示的图像的最佳方式是什么 我知道我可以把它插入一个转换器中,然后在代码中手动进行绑定转换,但是有了WPF中提供的所有绑定功能,我认为可能有更好的方法。我认为你可以用 DataTemplateSelector在这里似乎不是一个好选择,因为a的所有值都有相同的模板 使用DataTriggers: <Data
我知道我可以把它插入一个转换器中,然后在代码中手动进行绑定转换,但是有了WPF中提供的所有绑定功能,我认为可能有更好的方法。我认为你可以用
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>
你的文字
还没有测试过,但想法是这样的。如果您创建本地数据模板并使用ContentPresenter
,那么在数据模板中执行此操作非常简单。此模板显示类型为MyObject
的对象,在显示Text
属性内容的TextBlock
旁边显示一个图像,其源由A
属性的类型确定:
<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>
(当A
的值更改时,您还需要为AType
引发PropertyChanged
。)完成此操作后,您应该能够在样式中实现数据触发器,例如:
<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>
如果使用数据模板选择器,是否需要为每种类型的项目创建新模板?是。也许我误解了你的意思。我编辑了我的答案。这似乎并没有回答“取决于房产类型”的问题。
public Type AType { get { return A.GetType(); } }
<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>