我有一个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数据库。
感谢您提供任何帮助或建议。
答案 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>
。