Как заполнить несколько свойств коллекции в элементе Xaml

Я создаю класс, наследуемый от 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] Когда приведенный выше Xaml анализируется с помощью XamlReader, происходит сбой с сообщением «Свойство ExtendedParagraph.Inlines уже установлено и может быть установлено только один раз».

[2] Я не уверен, какую разметку следует использовать для объявления экземпляров KeyValuePair в элементе Attributes.

Я надеюсь, что кто-то может указать мне в правильном направлении.

Большое спасибо, Тим

Изменить - я нашел ответ на вопрос [1]. Это просто влечет за собой объявление сначала коллекции Attributes (с использованием синтаксиса элемента свойства), а затем содержимого абзаца:

<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> оказывается более сложным. Я нашел несколько подсказок в этот пост, но я еще не добился рабочего результата. Ваши идеи по-прежнему приветствуются.


person Tim Coulter    schedule 07.04.2010    source источник


Ответы (1)


Я не уверен, можно ли ответить на мой собственный вопрос, но, поскольку никто другой, кажется, не знает, я поделюсь решением, которое я принял.

По-видимому, поддержка дженериков в Xaml ограничена, а это означает, что нет собственного махинизма Xaml для заполнения Dictionary<TKey, TValue> (или любого другого универсального класса коллекции).

Однако, как описано в этой статье, возможно для создания пользовательского класса расширения разметки, и после настройки в соответствии с типом члена коллекции он будет успешно декларативно заполнять свойство коллекции:

<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>
person Tim Coulter    schedule 08.04.2010