繁体   English   中英

DataGrid-在CellEditEnding()之后触发的事件

[英]DataGrid - Event which fires after CellEditEnding()

我有一个与对象( ItemsSource )的List <>关联的DataGrid CellEditEnding ()事件中,我更改了链接对象列表的数据。 要刷新DataGrid ,必须刷新它:

this.DataGridFieldProperties.Items.Refresh();

CellEditEnding()事件中的代码调用更新将引发InvalidOperationException

题:
CellEditEnding()之后是否触发事件?

到目前为止我尝试过的
多个事件,例如GotFocusColumnDisplayIndexChanged()等,以及双向绑定。 但是它们都不可靠地工作,并在异步线程中刷新DataGridTask.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; } = "";
    }
}

您应该在您的SoExample类中实现INotifyPropertyChanged

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM