Я пытаюсь показать 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.
Работа Bindings - имена элементов управления отображаются в 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