Comment faire pour remplir des propriétés de collecte multiples dans un élément Xaml

StackOverflow https://stackoverflow.com/questions/2591532

  •  25-09-2019
  •  | 
  •  

Question

Je crée une classe qui hérite de System.Windows.Documents.Paragraph et ajoute une nouvelle propriété de collection. Voici une représentation très simplifiée de cette classe:

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

Je dois créer et remplir une instance de la classe au-dessus de l'intérieur Xaml, ce qui nécessite une syntaxe de balisage qui permet au contenu du paragraphe et les membres de sa collection Attributs à déclarer séparément.

Étant donné que la classe paragraphe est décoré avec le [ContentProperty("Inlines")] d'attribut, je suppose que je dois remplir explicitement les Inlines et les collections d'attributs. Sur la base de la syntaxe XAML je l'ai vu utilisé pour résoudre des problèmes similaires ailleurs, je prévois quelque chose comme ceci:

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

Cependant, cette approche présente deux problèmes:

[1] Lorsque ce qui précède XAML utilise XamlReader analysables, il échoue avec le message « propriété ExtendedParagraph.Inlines a déjà été défini et peut être défini uniquement une fois »

[2] Je ne suis pas sûr de ce que je devrais utiliser le balisage pour déclarer les cas de KeyValuePair dans l'élément Attributs.

J'espère que quelqu'un peut me diriger dans la bonne direction.

Merci, Tim

Edit - J'ai trouvé la réponse à la question [1]. Elle implique simplement déclarer la collection des attributs (en utilisant la syntaxe d'élément de propriété) en premier, suivi par le contenu du paragraphe:

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

Cependant, déclarative ajouter des membres à un Dictionary<TKey, TValue> se révèle plus difficile. J'ai trouvé quelques indices dans cette post, mais je n'ai pas encore atteint un résultat de travail. Vos idées sont toujours les bienvenus.

Était-ce utile?

La solution

Je ne suis pas sûr que ce soit OK pour répondre à ma propre question, mais, puisque personne ne semble savoir, je vais partager la solution que je l'ai adopté.

Apparemment, le soutien aux génériques en XAML est limitée, ce qui signifie qu'il n'y a pas machamism natif Xaml pour remplir un Dictionary<TKey, TValue> (ou toute autre classe de collection générique).

Cependant, comme cet article décrit, il est possible de créer une classe personnalisée balisage d'extension et, une fois configuré en fonction du type de membre de la collection, il remplira avec succès une propriété de collection déclarative:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top