WPF将嵌入在DataGridTemplateColumn中的ComboBox绑定到DataTable

时间:2017-09-02 15:39:18

标签: c# wpf combobox datagrid datagridtemplatecolumn

我有一个DataGrid,其DataContext(在C#代码中)设置为DataTable,以便DataGrid中的每一列都绑定到DataTable中的一列。在DataGrid的一列中,我想显示一个可编辑的ComboBox,它提供从MySQL数据库中提取并存储在另一个DataTable中的选项。这个DataTable是使用ObjectDataProvider提供的,并且正确填充(我使用调试器跟踪它)。但问题是,DataGrid中的ComboBox仅显示同一列中其他单元格中的DataTable 中的项目。如何让ComboBox显示从DataTable中检索的项目的完整列表?

以下是代码的相关部分。

为ComboBox提供DataTable的ObjectDataProvider是:

    <ObjectDataProvider x:Key="AbodesTable"
        ObjectType="{x:Type local:DatabaseTable}"
        MethodName="GetTable">
        <ObjectDataProvider.MethodParameters>
            <s:String>SELECT * FROM abode</s:String>
            <s:String>AbodeName</s:String>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

DatabaseTable类只是将查询发送到MySQL数据库并填充并返回DataTable并且工作正常。

DataGrid是:

    <DataGrid x:Name="baptismDataGrid" Margin="0" Grid.Row="1" AutoGenerateColumns="False"
              IsReadOnly="False" ItemsSource="{Binding}" SelectionMode="Single"
              RowEditEnding="transcriptDataGrid_RowEditEnding" 
              KeyUp="transcriptDataGrid_KeyUp">
              <DataGrid.Columns>
              .....<!-- Other columns -->
              <DataGridTemplateColumn x:Name="AbodeColumn" Header="Abode">
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                         <TextBlock Text="{Binding Abode}"></TextBlock>
                      </DataTemplate>
                   </DataGridTemplateColumn.CellTemplate>
                   <DataGridTemplateColumn.CellEditingTemplate>
                      <DataTemplate>
                         <ComboBox ItemsSource="{Binding Source={StaticResource AbodesTable} }" IsEditable="True"
                                 Text="{Binding Abode}" 
                                 DisplayMemberPath="AbodeName" 
                                 SelectedValuePath="AbodeName">
                          </ComboBox>
                        </DataTemplate>
                      </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>
                  </DataGrid.Columns>
                </DataGrid>

绑定到&#34; Abode&#34;将ComboBox中的文本绑定到DataTable中的Abode列,该列是DataGrid的DataContext。 AbodeName是ComboBox绑定到的DataTable中列的名称。

问题是ComboBox只包含AbodesTable静态资源中的那些项目,这些项目位于DataGrid中Abode列的现有单元格中。 (换句话说,在set术语中,ComboBox包含AbodesTable中的这些元素与DataGrid中Abode列中的条目集的交集。)我希望ComboBox包含所有项在AbodesTable中,无论它们是否已经出现在DataGrid中。

除了这个问题,该程序正常工作,因为通过从ComboBox中选择或只是输入一些文本进入Abode列的东西正确地绑定到底层DataTable,因此DataTable可以写回到MySQL数据库。

感谢您提供任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

我已经通过DataTable中的converting the desired column将其解析为List<string>并将其用作ComboBox的ItemsSource。上面的DataGridTemplateColumn中的ComboBox现在看起来像这样:

     <ComboBox ItemsSource="{Binding Source={StaticResource AbodesList}}" 
               IsEditable="True" Text="{Binding Abode}">
     </ComboBox>

StaticResource AbodesList引用一个ObjectDataProvider,它查询MySQL数据库并将所需的列转换为List<string>