Это довольно просто сделать в шаблоне данных, если вы создаете локальные шаблоны данных и используете 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>
Если вы хотите использовать для этого стили, вместо этого вы столкнетесь с проблемой, потому что триггеры данных хотят посмотреть значения свойств, а type свойства A
сама по себе не выставляется как собственность.
Если, конечно, вы не реализуете:
public Type AType { get { return A.GetType(); } }
(Вам также потребуется повысить PropertyChanged
для AType
, когда значение 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>