0

经过 1.5 天的头疼、消耗咖啡的努力,我终于屈服并呼吁您的明智建议 :)。

我发现了很多关于ComboBox DataBindinginside 的帖子DataGrid TemplateColumn,但似乎没有一个对我有帮助。

这是我的问题:

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

我的第二个ViewSource是带有数据库列信息的那些对象的列表。

我的目标是加载Excela 中的所有列,WPF DataGridComboBox在每一行中列出所有数据库列。

当我使用 a 时这很好用DataGridComboBoxColumn,但我不喜欢用户必须单击 3 次才能打开 ComboBox。无论如何,您需要单击它在视觉上并不是很明显。(好吧,也许我可以设计它)。

所以我把一个正常WPF ComboBox的,DataGridTemplateColumn但所有组合框都有 SelectedItem 绑定到 DataGrid.SelectedItem,而不是它们所属的实际行。无论我尝试什么,我都无法让它表现出来!:)

    <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">
        <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 DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext}"
                                  ItemsSource="{Binding Source={StaticResource EntityPropertiesViewSource}}"
                                  DisplayMemberPath="DisplayName" 
                                  SelectedItem="{Binding EntityProperty}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
4

1 回答 1

0

我想我现在可以开始工作了。诀窍是避免为 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 对象都需要拥有 EntityProperties 完整列表的副本:

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; }
}

如果有人可能知道更好(更清洁)的解决方案,请告诉我:)

于 2013-03-24T15:47:25.000 回答