Обновление DataGrid после изменения значения строки DataTable

У меня есть настройка DataGrid (с именем m_grid), чтобы он отображал строки таблицы данных:

 <DataGrid name="m_grid">
      <DataGrid.Columns>
           <DataGridCheckBoxColumn Header="Locked"
                                   Binding="{Binding '[Locked]'}"/>
           ...
      </DataGrid.Columns>
 </DataGrid>

Я заполняю сетку в коде так:

 DataTable l_table = Database.GetTable("SELECT * FROM Reports")
 m_grid.ItemsSource = l_table.Rows;

У меня есть контекстное меню, к которому прикреплен следующий метод, связанный с событием click:

 DataRow l_row = m_grid.SelectedItem as DataRow;
 int l_id = (int)l_row["Report ID"];
 int l_result = Database.Execute("Update [Reports] SET [Locked] = not [Locked] WHERE [Report ID]=" + l_id;
 if (l_result > 0){
      l_row["Locked"] = !l_row["Locked"];
 }

После запуска щелчка база данных обновляется, и значение в строке изменяется, но DataGrid остается неизменным. Я пытался использовать

m_grid.BeginEdit();
// execute code
m_grid.CommitEdit();

Но это не имело никакого эффекта. Я что-то здесь упускаю или мне нужно изменить способ привязки моих данных к сетке. Благодарю.

1 ответ

Решение

Я не думаю, что DataRow реализует уведомления. Вместо использования Rows collection в качестве ItemsSource (m_grid.ItemsSource = l_table.Rows;) использовать DefaultView:

 m_grid.ItemsSource = l_table.DefaultView;

Он также будет правильно автоматически генерировать столбцы в DataGrid. А DataView поддерживает сортировку и фильтрацию.

Но обратите внимание, что после такого изменения DataGrid будет содержать элементы типа DataRowView (у которого есть Row имущество). Код, который использует SelectedItem, также должен быть изменен

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