根据类型选择数据模板

时间:2016-02-18 21:51:46

标签: c# wpf xaml mvvm datatemplate

我已宣布以下类型:

public interface ITest { }
public class ClassOne : ITest { }
public class ClassTwo : ITest { }

在我的viewmodel中,我宣布并初始化以下集合:

public class ViewModel
{
    public ObservableCollection<ITest> Coll { get; set; } = new ObservableCollection<ITest>
    {
        new ClassOne(),
        new ClassTwo()
    };  
}

在我看来,我宣布以下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>

我希望看到的是一个红色正方形,后跟一个蓝色方块,而我所看到的是以下内容:

enter image description here

我做错了什么?

2 个答案:

答案 0 :(得分:15)

您的问题可能是由XAML的辛苦工作引起的。具体来说,您需要将Type传递给DataType,但是您传递的是带有该类型名称的字符串。

使用x:Type来装饰DataType的值,如下所示:

<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>

答案 1 :(得分:0)

您也可以使用DataTemplateSelector。 MSDN ref.Stackoverflow ref.

相关问题