1

由于我经常使用TemplateSelectors基于类型来区分模板,因此我尝试编写一个TemplateSelector具有属性来保存类型/模板关系的模板。

我尝试使用x:Array在 XAML 中设置此属性。这不起作用,因为 VS 抱怨这x:Array不是一个实现的类,IEnumerable根据文档它应该

MSDN:

但是 x:Array 也可用于使用 XAML 填充某些属性,这些属性将通用集合支持接口或类作为其结构化属性内容,例如 IEnumerable。

这里对应的代码行

模板选择器

public class TypeMatchDataTemplateSelector : DataTemplateSelector
{
    public TypeTemplate[] Templates { get; set; }

    ...
}

public class TypeTemplate
{
    public Type Type { get; set; }
    public DataTemplate Template { get; set; }
}

在 XAML 中使用

<x:Array Type="ct:TypeTemplate" x:Key="fooTemplates">
    <ct:TypeTemplate
        Type="{x:Type logic:NamedRegisterInformation}"
        Template="{StaticResource RegisterListTemplate}" />
    <ct:TypeTemplate
        Type="{x:Type logic:AddressedRegisterInformation}"
        Template="{StaticResource RegisterListTemplate}" />
</x:Array>

<ct:TypeMatchDataTemplateSelector
    x:Key="foo"
    Templates="{StaticResource fooTemplates}"/>
...
...
<ListBox ItemTemplate="{StaticResource blub}">

使用的类型和模板应该是正确的。如果我执行代码,我会在运行时收到此异常:

无法将属性“模板”中的值转换为“EP3_gui.UI.ContentTemplates.TypeTemplate[]”类型的对象。“System.Windows.Markup.ArrayExtension”类型的对象无法转换为“EP3_gui.UI.ContentTemplates.TypeTemplate[]”类型。标记文件 'EP3_gui;component/ui/readmsfrcontrol.xaml' 第 36 行位置 11 中的对象 'blub' 出错。

任何提示我的错误可能在哪里?

4

1 回答 1

1

你为什么要让你的生活如此艰难?我的意思是还有很多其他方法可以成为一名优秀的程序员!我刚才是开玩笑的。

您可以简单地编写两个"DataTemplate"s 并根据它们过滤它们,"DataType"如下所示:

<Window.Resources>

    <DataTemplate DataType="x:Type logic:AddressedRegisterInformation" ></DataTemplate>

    <DataTemplate DataType="x:Type logic:NamedRegisterInformation" ></DataTemplate>

</Window.Resources>
<ListBox ItemsSource="{Binding}" />

你为什么不这样做?而不是尝试使用"TemplateSelector"可能会导致您遇到许多问题的复杂自定义,例如您提到的问题。这样,WPF 将完成所有选择的事情,你坐下来,将一个数组绑定"Object""ItemsSource".

希望能帮助到你

于 2012-11-26T17:03:44.840 回答