WPF привязывает ComboBox, встроенный в DataGridTemplateColumn к DataTable
У меня есть DataGrid, чей DataContext установлен (в коде C#) на DataTable, так что каждый столбец в DataGrid привязан к столбцу в DataTable. В одном столбце DataGrid я хочу отобразить редактируемый ComboBox, который предлагает опции, которые извлекаются из базы данных MySQL и хранятся в другом DataTable. Этот DataTable предоставляется с использованием ObjectDataProvider и заполняется правильно (я проследил это с помощью отладчика). Однако проблема в том, что ComboBox в DataGrid отображает только те элементы, которые находятся как в DataTable, так и уже в других ячейках в том же столбце. Как я могу заставить ComboBox отображать полный список элементов, извлеченных из DataTable?
Вот соответствующие биты кода.
ObjectDataProvider, который предоставляет DataTable для ComboBox:
<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>
Привязка к Abode привязывает текст в ComboBox к столбцу Abode в DataTable, который является DataContext для DataGrid. AbodeName - это имя столбца в DataTable, к которому привязан ComboBox.
Проблема заключается в том, что ComboBox содержит только те элементы из статического ресурса AbodesTable, которые находятся в существующих ячейках столбца Abode в DataGrid. (Другими словами, в терминологии набора ComboBox содержит пересечение этих элементов в AbodesTable и набора записей в столбце Abode в DataGrid.) Я бы хотел, чтобы ComboBox содержал все элементы в AbodesTable, независимо от того, они уже появляются в DataGrid.
Помимо этой проблемы, программа работает должным образом, в том, что что-то, введенное в столбец Abode путем выбора из ComboBox или простого ввода некоторого текста, должным образом привязано к базовому DataTable, поэтому DataTable может быть записан обратно в базу данных MySQL.
Спасибо за любую помощь или предложения.
1 ответ
Я решил это путем преобразования нужного столбца в DataTable в List<string>
и используя это как ItemsSource для ComboBox. ComboBox в DataGridTemplateColumn выше теперь выглядит так:
<ComboBox ItemsSource="{Binding Source={StaticResource AbodesList}}"
IsEditable="True" Text="{Binding Abode}">
</ComboBox>
StaticResource AbodesList ссылается на ObjectDataProvider, который запрашивает базу данных MySQL и преобразует нужный столбец в List<string>
,