У меня есть DataGrid
, связанный с List <>
объектов (ItemsSource
).В событии CellEditEnding ()
я изменяю данные списка связанных объектов.Чтобы обновить DataGrid
, его необходимо обновить:
this.DataGridFieldProperties.Items.Refresh();
При вызове обновления из кода в событии CellEditEnding()
выдается InvalidOperationException
.
Вопрос: Есть ли событие, вызванное после CellEditEnding ()?
Что я пробовал до сих пор Несколько событий, таких как GotFocus
, ColumnDisplayIndexChanged()
и т. Д., И двусторонние привязки.Но ни один из них не работает надежно и не обновляет DataGrid
в асинхронном потоке (асинхронное событие с Task.Run()
)
Пример
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Name="Btn_FillGrid" Click="Btn_FillGrid_Click"/>
<DataGrid Name="DataGrid_SOExample" Grid.Row="1" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="False" CellEditEnding="DataGrid_SOExample_CellEditEnding">
<DataGrid.Columns>
<DataGridTextColumn Header="Generic1"/>
<DataGridTextColumn Header="Generic2"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
public partial class Win_SOExample : Window
{
public Win_SOExample()
{
InitializeComponent();
}
private void Btn_FillGrid_Click(object sender, RoutedEventArgs e)
{
List<SoExample> soExampList = new List<SoExample>();
soExampList.Add(new SoExample() { Field1 = "Row0 Field1", Field2 = "Row0 Field2" });
soExampList.Add(new SoExample() { Field1 = "Row1 Field1", Field2 = "Row1 Field2" });
soExampList.Add(new SoExample() { Field1 = "Row2 Field1", Field2 = "Row2 Field2" });
(this.DataGrid_SOExample.Columns[0] as DataGridTextColumn).Binding = new Binding("Field1") { Mode = BindingMode.TwoWay };
(this.DataGrid_SOExample.Columns[1] as DataGridTextColumn).Binding = new Binding("Field2") { Mode = BindingMode.TwoWay };
this.DataGrid_SOExample.ItemsSource = soExampList;
}
private async void DataGrid_SOExample_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if(e.EditAction == DataGridEditAction.Commit)
{
// after the user finished the edit, data in other rows needs to get updatet
// simple example
List<SoExample> soExampList = (this.DataGrid_SOExample.ItemsSource as List<SoExample>);
soExampList[1].Field1 = DateTime.Now.ToLongDateString();
await Task.Yield();
this.DataGrid_SOExample.Items.Refresh();
}
}
private class SoExample
{
public string Field1 { get; set; } = "";
public string Field2 { get; set; } = "";
}
}