Как привязать данные к DataGridComboBoxColumn в DataGrid с помощью MVVM - PullRequest
15 голосов
/ 25 августа 2010

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

Контекст данных содержит наблюдаемую коллекцию Goals: GoalList и список областей жизни: LifeAreaList. Я хочу, чтобы пользователь мог выбрать другую жизненную область для цели. Также отображаемое значение должно содержать название области жизни.

EDIT


Решение состоит в том, что ItemsSource для DataGridComboBoxColumn должен быть установлен как статический ресурс. Другой вариант - установить ItemsSource с помощью кода.

В итоге у меня есть:

<DataGridComboBoxColumn x:Name="_lifeAreaComboBoxColumn" SelectedItemBinding="{Binding LifeArea}" DisplayMemberPath="Name" Header="Life Area">

В коде позади я установил ItemsSource:

_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();

Когда я получу шанс, я преобразую это в StaticResource.

Ответы [ 3 ]

22 голосов
/ 25 августа 2010

Вам нужно сделать что-то вроде этого (не стреляйте в мессенджера):

<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>
1 голос
/ 23 января 2015

Up также может использовать DataGridTemplateColumn и просто поместить в него ComboBox и затем связать с ним соответствующие события.

<DataGridTemplateColumn Header="Alpha">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate DataType="models:MyModelDescription">
            <ComboBox ItemsSource="{Binding AlphaLevels, Mode=OneWay}" SelectedItem="{Binding Alpha, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"></ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
1 голос
/ 25 августа 2010

В дополнение к привязке вашего 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;
}
...