ComboBox ItemTemplate seulement de travail dans la liste déroulante
Je suis en train d'afficher une liste déroulante dont ItemsSource est une collection de Contrôles (c'est une partie d'une grille de propriété, la zone de liste déroulante doit afficher les noms des contrôles, et l'utilisateur doit être en mesure de sélectionner les commandes). Voici un très simplifié de la reproduction du problème:
<ComboBox ItemsSource="{Binding GroupBoxes}" SelectedValue="{Binding SelectedGroupBox}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
GroupBoxes et SelectedGroupBox sont DependencyProperties de type ObservableCollection et de la Zone.
Les Liaisons travail - le contrôle noms sont affichés dans la zone de liste déroulante-Liste, et si je sélectionne un article différent, je peux voir que la SelectedGroupBox propriété est mise à jour correctement. Le problème: l'élément sélectionné n'est jamais affiché dans la zone de liste déroulante. Réglage de la SelectedGroupBox bien de plus, le code fonctionne comme prévu - la zone de liste déroulante soulève SelectionChanged et ses SelectedValue est correct, mais il n'est toujours pas d'affichage de la valeur actuelle.
Si je fais la même chose avec n'importe quel autre type de classe, tout fonctionne comme prévu.
Recherche d'une réponse, je suis tombé sur beaucoup de messages de personnes ayant la même consonance problèmes, mais elles ont presque toutes été Liaison proplems qui n'est pas le cas ici.
Edit:
Pour simplifier l'essayer, voici le code derrière. Il suffit de déposer le dessus de XAML dans une nouvelle Fenêtre, et le code ci-dessous dans le code derrière.
public MainWindow() {
InitializeComponent();
this.DataContext = this;
this.GroupBoxes = new ObservableCollection<GroupBox>();
this.GroupBoxes.Add(new GroupBox() { Name = "AAA", Header = "AAA", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "BBB", Header = "BBB", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "CCC", Header = "CCC", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "DDD", Header = "DDD", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "EEE", Header = "EEE", Height = 100, Background = Brushes.Purple });
}
#region GroupBoxesProperty
public static readonly DependencyProperty GroupBoxesProperty = DependencyProperty.Register(
"GroupBoxes", typeof(ObservableCollection<GroupBox>), typeof(MainWindow)
);
public ObservableCollection<GroupBox> GroupBoxes {
get { return (ObservableCollection<GroupBox>)GetValue(GroupBoxesProperty); }
set { SetValue(GroupBoxesProperty, value); }
}
#endregion
#region SelectedGroupBoxProperty
public static readonly DependencyProperty SelectedGroupBoxProperty = DependencyProperty.Register(
"SelectedGroupBox", typeof(GroupBox), typeof(MainWindow),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (s, e) => (s as MainWindow).OnSelectedGroupBoxChanged())
);
public GroupBox SelectedGroupBox {
get { return (GroupBox)GetValue(SelectedGroupBoxProperty); }
set { SetValue(SelectedGroupBoxProperty, value); }
}
void OnSelectedGroupBoxChanged() {
Console.WriteLine("selection is now " + this.SelectedGroupBox.Name);
}
#endregion
Non, ça ne change rien, il montre la ToString()-contenu plutôt que de le Nom dans la liste Déroulante, mais le problème de l'invisible SelectedValue reste.
Vous avez toutes vos
WPF Trace Settings
allumé. Ces sont désactivés par défaut. Il y a beaucoup de WPF, les avertissements et les erreurs de visual studio mange.Je me suis tourné sur mais il n'y avait pas de problèmes.
OriginalL'auteur wilford | 2011-11-23
Vous devez vous connecter pour publier un commentaire.
La zone de liste déroulante, pour des raisons complexes expose une propriété en lecture seule appelée SelectionBoxItem. Le contenu de l'animateur dans la zone de liste déroulante modèle de lie sur cette propriété. C'est le SelectionBoxItem qui expose la représentation de chaîne de non-éléments de l'INTERFACE utilisateur vous permettant de voir la valeur sélectionnée. L'utilisation de cette propriété est ce qui empêche le contenu présentateur de l'utilisation des modèles de données. C'est pourquoi, le modèle s'applique à la liste déroulante, mais pas l'élément sélectionné. Ici est la partie de la valeur par défaut zone de liste déroulante modèle de l'origine du problème:
Cependant, vous pouvez créer votre propre zone de liste déroulante style qui remplace la valeur par défaut ContentPresenter et utilise le SelectedItem au lieu de SelectionBoxItem et ItemTemplate au lieu de SelectionItemBoxTemplate. Cela permettra de résoudre le problème.
OriginalL'auteur icirellik
Utilisation
DisplayMemberPath
au lieu de liaison pour nom:La raison pour le comportement que vous voir est probablement que vous devez définir une autre propriété de l'élément sélectionné modèle: http://msdn.microsoft.com/en-us/library/system.windows.controls.combobox.selectionboxitemtemplate.aspx
Mise à jour: j'ai écrit ma réponse sans vérification de votre code, désolé pour ça. Maintenant, j'ai lu votre code et remarqué que vous êtes liaison
SelectedValue
de la propriété. Je ne pense pas que c'est la meilleure propriété de lier dans votre cas, généralement bienSelectedItem
doit être utilisé. Je me souviens que je n'ai jamais eu rien à faire avecSelectionBoxItem
trucs mentionné dans d'autres réponse, c'est probablement parce queSelectedValue
etSelectedItem
propriétés se comportent différemment et j'ai tendance à utiliserSelectedItem
chaque fois que je le peux. Dans votre cas, je l'utilise aussi.DisplayMemberPath
au lieu de laItemTemplate
cependant cela ne résout pas le problème.À l'aide de DisplayMemberPath est plus courte dans l'exemple ci-dessus, mais dans mon application j'ai besoin d'accéder à d'autres propriétés de l'objet et la possibilité de changer la façon dont ils sont affichés. Et comme icirellik dit, il ne résout pas le problème.
J'ai mis à jour la réponse. Pouvez-vous tester votre code d'origine avec
SelectedItem
au lieu deSelectedValue
?Je l'ai essayé, mais seulement de remplacer SelectedValue avec SelectedItem ne change pas le fait que SelectionBoxItemTemplate est utilisé pour la sélection au lieu de ItemTemplate (qui je l'attendais et négligé de vérifier), de sorte que le comportement est le même. Et je n'ai qu'un accès en lecture à SelectionBoxItemTemplate, ce qui était le problème. De ce que j'ai lu à propos de la différence entre SelectedValue et SelectedItem, je pense qu'il ne fait pas de différence ici, dont celui que j'utilise.
Ok il a obtenu, maintenant je vois qu'il happenes parce que vous avez
GroupBoxes
dans votre zone de liste déroulante. N'a pas été mentionné qu'avant. C'est à vous, mais je voudrais essayer d'éviter de telles situations.OriginalL'auteur Snowbear