Ячейка WPF Caliburn.Micro DataGrid не обновляется до события - PullRequest
0 голосов
/ 10 января 2020

У меня есть тестовое WPF приложение, использующее Caliburn.Micro. Я пытаюсь построить с DataGrid, который можно редактировать. Данные обновят базу данных при обновлении cell / row.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда происходит событие RowEditEnding. Он передает информацию в строке до ее редактирования. Мне интересно, как я могу получить обновленную информацию, передаваемую функции.

Любая помощь будет оценена. Соответствующий код ниже:

Просмотр:

<DataGrid x:Name="People"
          AutoGenerateColumns="False"
          CanUserReorderColumns="True"
          CanUserAddRows="True"
          AlternatingRowBackground="#dfdfdf"
          cal:Message.Attach="[Event RowEditEnding] = [Action SavePeopleEdit($this)]">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding FirstName}">
            <DataGridTextColumn.Header>
                <TextBlock Text="First"
                           ToolTip="This Persons First Name" />
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
        <DataGridTextColumn Binding="{Binding LastName}">
            <DataGridTextColumn.Header>
                <TextBlock Text="Last"
                           ToolTip="This Persons Last Name" />
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
        <DataGridTextColumn Binding="{Binding pNumber}">
            <DataGridTextColumn.Header>
                <TextBlock Text="Person Number"
                           ToolTip="This Persons pNumber" />
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid> 

ViewModel:

using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;

namespace SqliteEncryptionTest.ViewModels
{

public class ShellViewModel : Screen
{
    public IObservableCollection<PersonModel> _people;
    public IObservableCollection<PersonModel> People {
        get { return _people; }
        set {
            _people = value;
            NotifyOfPropertyChange(() => People);
            } 
        }

        public void SavePeopleEdit(object sender)
        {
            if (People != null)
            {
            MessageBox.Show(People[3].LastName.ToString());
            }
        }

        public ShellViewModel()
        {
            LoadPeopleList();
        }

        private void LoadPeopleList()
        {
            People = new BindableCollection<PersonModel>(SqliteDataAccess.LoadPeople());
        }

    }
} 

enter image description here Я изменил LastName на «Четыре», но он по-прежнему показывает значение «4».

1 Ответ

1 голос
/ 11 января 2020

Кажется, на это намекнул Павел Аниховский в комментарии к исходному сообщению, но я поясню это как ответ.

Это потому, что RowEditEnding (и CellEditEnding) выполняется непосредственно перед редактированием зафиксировано (см. , это делает c post ), поэтому вы можете остановить или отредактировать изменение, если вы sh, вы можете получить данные, которые были изменены, как показано в этом ответе SO

Однако наилучшим вариантом является добавление UpdateSourceTrigger=PropertyChanged к привязке каждого из столбцов DataGrid, которые вы хотите обновлять по мере их редактирования, это будет обновлять модель при каждом изменении до RowEditEnding выполняется.

<DataGrid x:Name="People"
          AutoGenerateColumns="False"
          cal:Message.Attach="[Event CellEditEnding] = [Action SavePeopleEdit($sender, $eventArgs)]">
<DataGrid.Columns>
    <!-- Will update while changed -->
    <DataGridTextColumn Header="First" Binding="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"/> 

    <!-- Will not update until after the change is committed -->
    <DataGridTextColumn Header="Last" Binding="{Binding LastName}"/> 
</DataGrid.Columns>

...