C# DataGridTemplateColumn中的ComboBox.SelectedItem不';t绑定到自己的DataGridRow
经过1.5天的洗头、喝咖啡的努力,我终于屈服了,并呼吁你提出明智的建议:) 我在一个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列,并在列出所有数据库列的每一行中都有一个组合框 当我使用
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; }
}