Données liées bouton radio liste dans WPF
J'ai une liste d'options dans un objet de données, et je veux faire l'équivalent d'un bouton radio liste pour permettre à l'utilisateur d'en choisir un et un seul d'entre eux. Une fonctionnalité semblable à une liste déroulante liée aux données de la boîte, mais dans le bouton radio de format.
Je suis bête, je pensais que ce serait construit dans, mais non. Comment voulez-vous faire?
OriginalL'auteur Scott O. | 2009-04-30
Vous devez vous connecter pour publier un commentaire.
En gros, après avoir examiné les résultats de google, j'ai commencé avec l'info de MSDN fil de discussion où le Dr WPF a fourni une réponse, qui parle de style d'une zone de liste à regarder à droite. Toutefois, lorsque la zone de liste est désactivée, le fond était d'un ennuyeux couleur que je ne pouvais pas me débarrasser de pour la vie de moi, jusqu'à ce que j'ai lu la MSDN exemple de la zone de liste ControlTemplate, ce qui montre le secret de la Frontière élément qui donnait des coups de mon arrière-plan cul.
Donc, la réponse finale ici était de ce style:
Qui fournit un ControlTemplate, et les styles, la zone de liste et les Éléments. Et il est utilisé comme ceci:
Plus je passe du temps avec WPF, plus je pense qu'il est le trivial incroyablement difficile et incroyablement difficile trivial. Profitez de. -Scott
J'ai souvent trouver plus facile d'utiliser un ItemsControl que ListBox quand j'ai besoin d'un répétée modèle.
non, ces problèmes sont toujours là 😉
OriginalL'auteur Scott O.
Lier la zone de liste à l'ItemsSource d'une zone de liste avec une liste des objets qui ont un Nom de propriété (cela peut changer)
important GroupName="radioList"
OriginalL'auteur
Je l'ai fait par le biais d'un
ValueConverter
qui convertit uneenum
à unbool
. En passant la valeur d'enum que votre bouton radio représente que l'ConverterParameter
, le convertisseur retourne si cette case doit être cochée ou pas.EnumConverter
est définie comme suit:Noter que je n'ai pas databind à la liste des énumérations pour générer les boutons de la radio, je l'ai fait à la main. Si vous voulais remplir la liste de boutons radio par une liaison, je pense que vous aurez besoin de changer la
IsChecked
de la liaison à unMultiBinding
qui se lie à la fois la valeur actuelle et la radio de la valeur d'enum, parce que vous ne pouvez pas utiliser une liaison surConverterParameter
.OriginalL'auteur Anthony Brien
Désolé, j'aimerais mettre cette réaction de Scott O'post d'un commentaire sur son post, mais je n'ai pas encore la réputation de le faire. J'ai vraiment aimé sa réponse qu'il a un style de solution, et donc ne nécessite pas d'ajout de code-behind ou de la création d'une mesure de contrôle, etc.
Cependant, j'ai eu un problème quand j'ai ensuite essayer en utilisant les contrôles à l'intérieur de la ListBoxItems. Lorsque j'utilise ce style, je ne suis pas en mesure de se concentrer tout de contrôles contenus grâce à cette ligne:
<RadioButton Focusable="False"
IsHitTestVisible="False"
IsChecked="{TemplateBinding IsSelected}">
Le bouton radio doit couper Focusable et IsHitTestVisible pour la IsChecked de liaison pour fonctionner correctement. Pour contourner ce problème, j'ai changé le IsChecked à partir d'un objet templatebinding régulier de liaison, qui m'a permis de faire une liaison bidirectionnelle. Retrait de la délinquance paramètres m'a donné cette ligne:
<RadioButton IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}">
Qui maintenant me permet de concentrer les contrôles contenus dans ListBoxItems comme prévu.
Espère que cette aide.
OriginalL'auteur Lachlan L.
Super Simple, MVVM amical, en tirant parti de DataTemplates pour les types.
XAML:
Modèle de vue, etc:
Si vous enveloppez votre option dans un type spécifique (ou probablement il l'est déjà). Il vous suffit de définir un DataTemplate pour ce type, WPF utilise automatiquement. (Définir le DataTemplate dans la zone de liste de ressources pour limiter le champ d'application de l'endroit où le DataTemplate sera appliqué).
Également utiliser le nom du groupe dans le DataTemplate pour l'ensemble du groupe si vous le souhaitez.
C'est beaucoup plus simple que de changer le modèle de contrôle, mais il ne signifie que vous obtenez une ligne bleue sur les articles sélectionnés. (Encore une fois, rien qu'un peu de style ne peut pas réparer).
WPF est simple quand vous savez comment.
OriginalL'auteur
J'ai pris mon inspiration de Jon Benson entrée de blog, mais a modifié sa solution pour utiliser les énumérations qui ont un attribut "description". Ainsi, les principales parties de la solution est devenue:
Agent recenseur avec des descriptions
Code pour la lecture des descriptions et le retour des paires clé/valeur pour la liaison.
L'Objet de votre Fournisseur de Données dans le code XAML
De votre zone de liste dans le code XAML
La propriété (par exemple dans votre modèle de vue) que vous liez à
OriginalL'auteur Brian Hinchey
J'ai triché:
Ma solution a été de lier la zone de liste programaticly puisque c'est tout ce qui semblait fonctionner pour moi:
Le XAML ressemble à ceci:
Et dans mon cas à la lecture de la valeur du bouton radio comme il est sélectionné ressemble à ceci:
Espère que ça aide quelqu'un.
OriginalL'auteur