Это сводит меня с ума. У меня есть DataGrid с DataGridComboBoxColumn, который я хочу, чтобы пользователь мог использовать для выбора. Это основной контур моей сетки.
<DataGrid ItemsSource="{Binding GoalList}" DockPanel.Dock="Bottom" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{Binding LifeAreaList}" Header="Life Area"/>
<DataGrid.Columns>
</DataGrid>
DataGrid привязан к коллекции объектов типа Goal. Каждая цель имеет свойство типа LifeArea. Каждая LifeArea имеет свойства LifeAreaId и Name.
Контекст данных содержит наблюдаемую коллекцию целей: GoalList и список жизненных областей: LifeAreaList. Я хочу, чтобы пользователь мог выбрать другую область жизни для достижения цели. Также имя области жизни должно быть отображаемым значением.
РЕДАКТИРОВАТЬ
Решение состоит в том, что ItemsSource для DataGridComboBoxColumn должен быть установлен как статический ресурс. Другой вариант - установить ItemsSource с помощью кода.
В итоге у меня есть:
<DataGridComboBoxColumn x:Name="_lifeAreaComboBoxColumn" SelectedItemBinding="{Binding LifeArea}" DisplayMemberPath="Name" Header="Life Area">
В исходном коде я установил ItemsSource:
_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();
Когда у меня будет возможность, я конвертирую это в StaticResource.
Помимо привязки вашего SelectedItem, я предполагаю, что ваше свойство SelectedLifeArea не получено напрямую из LifeAreaList, поэтому при сравнении двух значений они возвращают false, даже если имя и идентификатор совпадают. Вероятно, вам нужно перезаписать функцию .Equals объекта LifeArea, чтобы она возвращала true, если идентификаторы обоих объектов совпадают
public override bool Equals(object obj)
{
if (obj is LifeArea)
{
return this.Id == (obj as LifeArea).Id;
}
return false;
}
Нужно сделать примерно так (не стрелять в мессенджера):
<DataGridComboBoxColumn Header="Life Area" SelectedItemBinding="{Binding SelectedLifeArea}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>