頭を悩ませ、コーヒーを消費する 1.5 日間の努力の後、私はついに屈服し、あなたの賢明なアドバイスを求めます :)。
ComboBox DataBinding
の内部に関するかなりの数の投稿を見つけましDataGrid TemplateColumn
たが、どれも役に立たなかったようです。
これは私の問題です:
Excel 列に関する情報をViewSource
含む with オブジェクトがあります。列名、列インデックス、およびデータベース列情報を含むオブジェクトです。
2 つ目ViewSource
は、データベースの列情報を含むオブジェクトのリストです。
私の目標は、すべてのExcel
列を aWPF DataGrid
にロードしComboBox
、各行にすべてのデータベース列をリストする を含めることでした。
これは を使用すると問題なく動作DataGridComboBoxColumn
しますが、ユーザーが ComboBox を開くために 3 回クリックする必要があるのは好きではありません。とにかくクリックする必要があることは、視覚的にはあまり明白ではありません。(おそらく私はそれをスタイルすることができます).
したがって、法線を入れますWPF ComboBox
がDataGridTemplateColumn
、すべてのコンボボックスには、それらが属する実際の行ではなく、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>