如何使用MVVM将数据绑定到DataGrid中的DataGridComboBoxColumn

时间:2010-08-25 06:24:44

标签: wpf mvvm datagrid datagridcomboboxcolumn

这让我发疯了。我有一个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。

属性

数据上下文包含一个可观察的目标集合:目标列表和生命区域列表:LifeAreaList。我希望用户能够为目标选择不同的生活区域。生命区域的名称也必须是显示的值。

修改


解决方案是必须将DataGridComboBoxColumn的ItemsSource设置为静态资源。另一种选择是通过代码设置ItemsSource。

最后我有:

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

在后面的代码中我设置了ItemsSource:

_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();

当我有机会时,我会将其转换为StaticResource。

3 个答案:

答案 0 :(得分:22)

你需要做这样的事情(不要射击信使):

<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 :(得分:1)

除了绑定您的SelectedItem之外,我猜测您的SelectedLifeArea属性不是直接从LifeAreaList获取的,因此在比较这两个值时,即使名称和ID匹配,它们也会返回false。您可能需要覆盖LifeArea对象的.Equals函数,以便在两个对象的ID匹配时返回true

public override bool Equals(object obj)
{
    if (obj is LifeArea)
    {
        return this.Id == (obj as LifeArea).Id;
    }
    return false;
}

答案 2 :(得分:1)

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>