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
Si vous utilisez {Binding} au lieu de {Binding Name} serait-il travailler et de montrer la valeur par défaut méthode ToString résultats de votre contrôle?
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