Es bastante simple hacer esto dentro de su plantilla de datos, si crea plantillas de datos locales y usa un ContentPresenter
. Esta plantilla presenta objetos de tipo MyObject
, mostrando una imagen cuya fuente está determinada por el tipo de la propiedad A
junto a un TextBlock
que muestra el contenido de la propiedad 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>
Si desea utilizar estilos de hacer esto, en su lugar, se encontrará con un problema, porque los desencadenadores de datos desean ver los valores de propiedad, y el tipo de la propiedad A
no está, en sí mismo, expuesto como una propiedad.
A menos que, por supuesto, se implementa una:
public Type AType { get { return A.GetType(); } }
(Usted también tendrá que aumentar PropertyChanged
de AType
cuando el valor de A
cambios.) Una vez hecho esto, usted debe ser capaz para implementar un activador de datos en un estilo, por ejemplo:
<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>
Si uso un selector de plantilla de datos, ¿no necesitaría crear una nueva plantilla para cada tipo de elemento? – gmn
Sí. Tal vez no entendí lo que estás tratando de hacer. Edité mi respuesta. –