0

頭を悩ませ、コーヒーを消費する 1.5 日間の努力の後、私はついに屈服し、あなたの賢明なアドバイスを求めます :)。

ComboBox DataBindingの内部に関するかなりの数の投稿を見つけましDataGrid TemplateColumnたが、どれも役に立たなかったようです。

これは私の問題です:

Excel 列に関する情報をViewSource含む with オブジェクトがあります。列名、列インデックス、およびデータベース列情報を含むオブジェクトです。

2 つ目ViewSourceは、データベースの列情報を含むオブジェクトのリストです。

私の目標は、すべてのExcel列を aWPF DataGridにロードしComboBox、各行にすべてのデータベース列をリストする を含めることでした。

これは を使用すると問題なく動作DataGridComboBoxColumnしますが、ユーザーが ComboBox を開くために 3 回クリックする必要があるのは好きではありません。とにかくクリックする必要があることは、視覚的にはあまり明白ではありません。(おそらく私はそれをスタイルすることができます).

したがって、法線を入れますWPF ComboBoxDataGridTemplateColumn、すべてのコンボボックスには、それらが属する実際の行ではなく、DataGrid.SelectedItem にバインドされた 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 に答える