C# WPF数据模板绑定取决于属性的类型

C# WPF数据模板绑定取决于属性的类型,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我有一个绑定到分层数据模板的对象集合,我的每个对象都有一个特定类型的属性(我们称之为属性“a”)。此类型因每个对象而异 如果数据模板包含图像和一些文本,那么根据属性“A”的类型更改模板中显示的图像的最佳方式是什么 我知道我可以把它插入一个转换器中,然后在代码中手动进行绑定转换,但是有了WPF中提供的所有绑定功能,我认为可能有更好的方法。我认为你可以用 DataTemplateSelector在这里似乎不是一个好选择,因为a的所有值都有相同的模板 使用DataTriggers: <Data

我有一个绑定到分层数据模板的对象集合,我的每个对象都有一个特定类型的属性(我们称之为属性“a”)。此类型因每个对象而异

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


我知道我可以把它插入一个转换器中,然后在代码中手动进行绑定转换,但是有了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>