[Edit] : J'ai trouvé comment faire ça tout seul. J'ai posté ma solution dans l'espoir qu'elle épargnera à quelqu'un d'autre quelques jours de recherche sur Google. Si vous êtes un gourou de WPF, jetez un coup d'œil à ma solution et faites-moi savoir s'il existe un moyen meilleur / plus élégant / plus efficace de le faire. En particulier, j'aimerais savoir ce que je ne sais pas... comment cette solution va-t-elle me desservir à l'avenir ? Le problème se résume vraiment à l'exposition des propriétés internes du contrôle.
Problème : Je suis en train de créer un code pour générer automatiquement une interface graphique liée à des données dans WPF pour un fichier XML. Je dispose d'un fichier xsd qui peut m'aider à déterminer les types de nœuds, etc. Les éléments simples de type Clé/Valeur sont faciles.
Quand j'analyse cet élément :
<Key>value</Key>
Je peux créer un nouveau "KeyValueControl" et définir la valeur de l'option DataContext
à cet élément. Le site KeyValueControl
est défini comme un UserControl
et a juste quelques liens simples sur elle. Cela fonctionne très bien pour tout XElement simple.
Le XAML à l'intérieur de ce contrôle ressemble à ceci :
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
Le résultat est une ligne qui comporte une étiquette avec le nom de l'élément et une zone de texte avec la valeur que je peux modifier.
Il arrive parfois que je doive afficher des valeurs de référence au lieu de la valeur réelle. Je voudrais créer une 'KeyValueComboBox' similaire à celle ci-dessus KeyValueControl
mais être en mesure de spécifier (sur la base des informations contenues dans le fichier) l'identité de l'utilisateur. ItemsSource
, DisplayMemberPath
et ValueMemberPath
. Les liens "DisplayMemberPath" et "ValueMemberPath" seraient les mêmes que ceux de l'option KeyValueControl
.
Je ne sais pas si un contrôle d'utilisateur standard peut gérer cela, ou si je dois hériter d'un contrôle de type Selector
.
Le XAML du contrôle ressemblerait à quelque chose comme ceci :
<Label Content={Binding Path=Name} />
<ComboBox SelectedValue={Binding Path=Value}
ItemsSource={Binding [BOUND TO THE ItemsSource PROPERTY OF THIS CUSTOM CONTROL]
DisplayMemberPath={Binding [BOUND TO THE DisplayMemberPath OF THIS CUSTOM CONTROL]
SelectedValuePath={Binding [BOUND TO THE SelectedValuePath OF THIS CUSTOM CONTROL]/>
Dans mon code, je ferais alors quelque chose comme ceci (en supposant que ce nœud est une "chose" et doit afficher une liste de choses pour que l'utilisateur puisse sélectionner l'ID :
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
Mes questions sont donc les suivantes :
1) Devrais-je hériter de mon KeyValueComboBox
de Control
ou Selector
?
2) Si je dois hériter de Control
comment puis-je exposer le contenu de la boîte de dialogue interne ? ItemsSource
, DisplayMemberPath
et ValueMemberPath
pour la liaison ?
3) Si je dois hériter de Selector, quelqu'un peut-il me fournir un petit exemple de la façon dont je pourrais commencer à le faire ? Encore une fois, je suis novice en WPF, donc un exemple simple et agréable m'aiderait vraiment si c'est la voie que je dois suivre.