ComboBox ItemTemplate работает только в выпадающем списке

Я пытаюсь показать ComboBox, чей ItemsSource является коллекцией элементов управления (он является частью PropertyGrid, ComboBox должен отображать имена элементов управления, и пользователь должен иметь возможность выбрать один из элементов управления). Вот крайне упрощенное воспроизведение проблемы:

<ComboBox ItemsSource="{Binding GroupBoxes}" SelectedValue="{Binding SelectedGroupBox}">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>          
</ComboBox>

GroupBoxes и SelectedGroupBox являются DependencyProperties типа ObservableCollection и GroupBox.

Связки работают - имена элементов управления отображаются в ComboBox-DropDown, и если я выбираю другой элемент, то вижу, что свойство SelectedGroupBox обновляется правильно. Проблема: выбранный элемент никогда не отображается в ComboBox. Установка свойства SelectedGroupBox из кода также работает как ожидалось - ComboBox поднимает SelectionChanged и его SelectedValue корректно, но он все еще не отображает текущее значение.

Если я проделаю то же самое с любым другим типом класса, все работает, как ожидалось.

В поисках ответа я наткнулся на множество сообщений от людей с похожими проблемами, но почти все они были проблемами связывания, а это не тот случай.

Edit:

Чтобы упростить процесс, вот код. Просто бросьте вышеприведенный XAML в новое окно, а код ниже в коде позади.

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
18
задан H.B. 23 November 2011 в 18:03
поделиться