Обновление 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, также должен быть изменен