C# DataGridTemplateColumn中的ComboBox.SelectedItem不';t绑定到自己的DataGridRow

C# DataGridTemplateColumn中的ComboBox.SelectedItem不';t绑定到自己的DataGridRow,c#,wpf,data-binding,datagrid,combobox,C#,Wpf,Data Binding,Datagrid,Combobox,经过1.5天的洗头、喝咖啡的努力,我终于屈服了,并呼吁你提出明智的建议:) 我在一个DataGrid TemplateColumn中找到了不少关于ComboBox数据绑定的帖子,但似乎没有一篇对我有帮助 这是我的问题: 我有一个ViewSource,其中的对象包含有关Excel列的信息: 列名、列索引和包含数据库列信息的对象 我的第二个ViewSource是包含数据库列信息的对象列表 我的目标是加载wpfdatagrid中的所有Excel列,并在列出所有数据库列的每一行中都有一个组合框 当我使用

经过1.5天的洗头、喝咖啡的努力,我终于屈服了,并呼吁你提出明智的建议:)

我在一个
DataGrid TemplateColumn
中找到了不少关于
ComboBox数据绑定的帖子,但似乎没有一篇对我有帮助

这是我的问题:

我有一个
ViewSource
,其中的对象包含有关Excel列的信息: 列名、列索引和包含数据库列信息的对象

我的第二个
ViewSource
是包含数据库列信息的对象列表

我的目标是加载
wpfdatagrid
中的所有
Excel
列,并在列出所有数据库列的每一行中都有一个
组合框

当我使用
DataGridComboBoxColumn
时,这很好,但我不喜欢用户必须单击3次才能打开组合框。不管怎样,在视觉上你都不太清楚你是否需要点击它。(好的,也许我可以设计它)

因此,我将一个普通的
WPF组合框
放在
datagridtemplate列
中,但所有组合框都已将SelectedItem绑定到DataGrid.SelectedItem,而不是它们所属的实际行。不管我怎么做,我都不能让它表现出来!:)


我想我现在可以用了。诀窍是避免对ItemSource使用单独的DataContext

     <DataGrid x:Name="ColumnMappings" DataContext="{StaticResource ColumnMappingsViewSource}" ItemsSource="{Binding}" Margin="10,146,10,40" Background="{DynamicResource ControlContainerBackgroundBrush}" BorderBrush="{DynamicResource ControlContainerBorderBrush}" AlternationCount="2" HeadersVisibility="Column" GridLinesVisibility="Horizontal" AutoGenerateColumns="False" SelectionMode="Single" RowBackground="{DynamicResource RowBackGroundBrush}" AlternatingRowBackground="{DynamicResource RowAlternatingBackGroundBrush}" CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ColumnName}" ClipboardContentBinding="{x:Null}" Header="Excel Kolom" Width="5*"/>
            <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource EntityPropertiesViewSource}}" SelectedItemBinding="{Binding EntityProperty}" DisplayMemberPath="DisplayName" Header="Database Kolom" Width="5*"/>
            <DataGridTemplateColumn Header="Database Kolom" Width="5*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding EntityProperties}"
                                  DisplayMemberPath="DisplayName" 
                                  SelectedItem="{Binding EntityProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

唯一的缺点是,我的每个ColumMapping对象都需要一份EntityProperty完整列表的副本:

public class ColumnMapping
{
    public ColumnMapping(string columnName, int columnIndex, EntityProperty entityProperty, List<EntityProperty> entityProperties)
    {
        ColumnName = columnName;
        ColumnIndex = columnIndex;
        EntityProperty = entityProperty;
        EntityProperties = entityProperties;
    }

    public string ColumnName { get; private set; }
    public int ColumnIndex { get; private set; }
    public EntityProperty EntityProperty { get; set; }
    public List<EntityProperty> EntityProperties { get; private set; }
}

public class EntityProperty
{
    public EntityProperty(string displayName, string name)
    {
        DisplayName = displayName;
        Name = name;
    }

    public string DisplayName { get; private set; }
    public string Name { get; private set; }
}
公共类列映射
{
公共列映射(字符串columnName、int columnIndex、EntityProperty EntityProperty、列表EntityProperty)
{
ColumnName=ColumnName;
ColumnIndex=ColumnIndex;
EntityProperty=EntityProperty;
实体属性=实体属性;
}
公共字符串ColumnName{get;private set;}
公共int列索引{get;private set;}
公共EntityProperty EntityProperty{get;set;}
公共列表实体属性{get;private set;}
}
公共类实体属性
{
公共EntityProperty(字符串显示名称、字符串名称)
{
DisplayName=DisplayName;
名称=名称;
}
公共字符串DisplayName{get;private set;}
公共字符串名称{get;private set;}
}

如果有人知道更好(更干净)的解决方案,请告诉我:)

删除组合框上的
DataContext
EntityProperty
驻留在当前行DataContext中,而不是DataGrid的DataContex中。不是吗?那是我第一次尝试(而且它确实适用于复选框)。但是,当我在这里删除DataContext时,当我更改其中一个框时,所有框仍然得到相同的值,现在实际的行甚至没有更新(DataGridComboxColumn没有更改):(在其他帖子中,我读到ComboBox ItemSource“覆盖”了DataContext。我的最佳猜测是,我需要指定正确的DataContext(行中的一个),但我不知道指向何处…
AncestorType={x:Type DataGridRow}
不起作用。。。
public class ColumnMapping
{
    public ColumnMapping(string columnName, int columnIndex, EntityProperty entityProperty, List<EntityProperty> entityProperties)
    {
        ColumnName = columnName;
        ColumnIndex = columnIndex;
        EntityProperty = entityProperty;
        EntityProperties = entityProperties;
    }

    public string ColumnName { get; private set; }
    public int ColumnIndex { get; private set; }
    public EntityProperty EntityProperty { get; set; }
    public List<EntityProperty> EntityProperties { get; private set; }
}

public class EntityProperty
{
    public EntityProperty(string displayName, string name)
    {
        DisplayName = displayName;
        Name = name;
    }

    public string DisplayName { get; private set; }
    public string Name { get; private set; }
}