Я пытаюсь показать 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