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>,

Другие вопросы по тегам