c# - Seleccionar una plantilla de datos basada en el tipo
wpf xaml (2)
He declarado los siguientes tipos:
public interface ITest { }
public class ClassOne : ITest { }
public class ClassTwo : ITest { }
En mi modelo de vista, declaro e inicializo la siguiente colección:
public class ViewModel
{
public ObservableCollection<ITest> Coll { get; set; } = new ObservableCollection<ITest>
{
new ClassOne(),
new ClassTwo()
};
}
En mi opinión, estoy declarando los siguientes ItemsControl
<ItemsControl ItemsSource="{Binding Coll}">
<ItemsControl.Resources>
<DataTemplate DataType="local:ClassOne">
<Rectangle Width="50" Height="50" Fill="Red" />
</DataTemplate>
<DataTemplate DataType="local:ClassTwo">
<Rectangle Width="50" Height="50" Fill="Blue" />
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
Lo que espero ver es un cuadrado rojo seguido de un cuadrado azul, en cambio lo que veo es lo siguiente:
¿Qué estoy haciendo mal?
Su problema puede ser causado por el funcionamiento complejo de XAML. Específicamente, debe pasar Type
a DataType
, pero estaba pasando una cadena con el nombre del tipo.
Utilice x:Type
para decorar el valor de DataType
, de esta forma:
<ItemsControl ItemsSource="{Binding Coll}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:ClassOne}">
<Rectangle Width="50" Height="50" Fill="Red" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ClassTwo}">
<Rectangle Width="50" Height="50" Fill="Blue" />
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
También puedes usar DataTemplateSelector para eso. MSDN ref. y ref.