如何在Xaml元素中填充多个集合属性

时间:2010-04-07 10:14:58

标签: xaml xamlparseexception

我正在创建一个继承自System.Windows.Documents.Paragraph的类,并添加一个新的集合属性。以下是该类的简化表示:

public class ExtendedParagraph : Paragraph
{
    public Dictionary<string, string> Attributes { get; set; }
}

我需要在Xaml中创建和填充上述类的实例,这需要一个标记语法,允许段落的内容和其Attributes集合的成员分别声明。

由于Paragraph类使用属性[ContentProperty("Inlines")]进行修饰,我假设我需要显式填充Inlines和Attributes集合。基于我曾经看到的Xaml语法用于解决其他地方的类似挑战,我设想这样的事情:

<ExtendedParagraph xmlns="clr-namespace:MyNamespace">
    <ExtendedParagraph.Inlines>

        This is where the paragraph content goes

    </ExtendedParagraph.Inlines>
    <ExtendedParagraph.Attributes>

        This is where the members of the Attributes property are declared 

    </ExtendedParagraph.Attributes>
</ExtendedParagraph>

然而,这种方法存在两个问题:

[1]当使用XamlReader解析上面的Xaml时,它失败并显示消息“已经设置了ExtendedParagraph.Inlines属性并且只能设置一次”

[2]我不确定在Attributes元素中声明KeyValuePair的实例应该用什么标记。

我希望有人能指出我正确的方向。

非常感谢, 添

编辑 - 我找到了问题[1]的答案。它只需要首先声明Attributes集合(使用属性元素语法),然后是Paragraph的内容:

<ExtendedParagraph xmlns="clr-namespace:MyNamespace">
    <ExtendedParagraph.Attributes>

        This is where the members of the Attributes property are declared 

    </ExtendedParagraph.Attributes>
    This is where the paragraph content goes
</ExtendedParagraph>

然而,声明性地将成员添加到Dictionary<TKey, TValue>更加困难。我在this post找到了一些线索,但我还没有达到工作效果。您的想法仍然受欢迎。

1 个答案:

答案 0 :(得分:2)

我不确定是否可以回答我自己的问题但是,由于其他人似乎都不知道,我会分享我采用的解决方案。

显然,Xaml中对泛型的支持是有限的,这意味着没有本地Xaml machamism来填充Dictionary<TKey, TValue>(或任何其他泛型集合类)。

但是,正如this article所述,可以创建自定义标记扩展类,并且一旦配置为适合集合成员类型,它将以声明方式成功填充集合属性:

<ExtendedParagraph.Attributes>
    <generic:DictionaryOfT TypeArgument="sys:String">
        <generic:DictionaryOfT.Items>
            <sys:String x:Key="String1">Hello</sys:String>
            <sys:String x:Key="String2">World</sys:String>
        </generic:DictionaryOfT.Items>
    </generic:DictionaryOfT>
</ExtendedParagraph.Attributes>