我有一个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; } = "";
}
}
答案 0 :(得分:1)
您应在INotifyPropertyChanged
类中实现SoExample
:
private class SoExample : INotifyPropertyChanged
{
private string _field1;
public string Field1
{
get { return _field1; }
set { _field1 = value; NotifyPropertyChanged(); }
}
private string _field2;
public string Field2
{
get { return _field2; }
set { _field2 = value; NotifyPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
然后您可以将属性设置为新值而无需刷新:
private async void DataGrid_SOExample_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if (e.EditAction == DataGridEditAction.Commit)
{
List<SoExample> soExampList = (this.DataGrid_SOExample.ItemsSource as List<SoExample>);
soExampList[1].Field1 = DateTime.Now.ToLongDateString();
}
}