c# wpf xaml mvvm datatemplate

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.