DataGrid - событие, которое срабатывает после CellEditEnding () - PullRequest
1 голос
/ 12 июня 2019

У меня есть 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; } = "";
    }
}

1 Ответ

1 голос
/ 12 июня 2019

Вы должны реализовать 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...