Как заполнить несколько свойств коллекции в элементе Xaml - PullRequest
1 голос
/ 07 апреля 2010

Я создаю класс, который наследуется от System.Windows.Documents.Paragraph и добавляет новое свойство коллекции. Вот очень упрощенное представление этого класса:

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

Мне нужно создать и заполнить экземпляр вышеупомянутого класса изнутри Xaml, для чего требуется синтаксис разметки, позволяющий объявлять содержимое абзаца и членов его коллекции атрибутов отдельно.

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

1 Ответ

2 голосов
/ 08 апреля 2010

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

По-видимому, поддержка дженериков в 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>
...