WPF Caliburn.Micro DataGrid 单元格在事件之前未更新

WPF Caliburn.Micro DataGrid Cell not updating before Event

我有一个测试 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> 

视图模型:

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

    }
} 

我将 LastName 更改为 "Four",但它仍然显示值为“4”。

这似乎是 Pavel Anikhouski 在对原始 post 的评论中暗示的,但我会澄清这一点作为答案。

这是因为 RowEditEnding(和 CellEditEnding)是在提交编辑之前执行的(参见 this doc post) so you can stop or edit change if you wish, you could grab the data that has been changed as shown in this

然而,最好的选择是将 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>