Как привязать данные к DataGridComboBoxColumn в DataGrid с помощью MVVM

Это сводит меня с ума. У меня есть 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.

15
задан GoalMaker 25 August 2010 в 22:35
поделиться

2 ответа

Помимо привязки вашего 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;
}
1
ответ дан 1 December 2019 в 03:04
поделиться

Нужно сделать примерно так (не стрелять в мессенджера):

<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>
22
ответ дан 1 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: