首页 > 解决方案 > WPF Caliburn.Micro DataGrid 单元在事件之前未更新

问题描述

我有一个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());
        }

    }
} 

在此处输入图像描述 我将姓氏更改为“四”,但它仍然显示值为“4”。

标签: c#wpfeventsdatagridcaliburn.micro

解决方案


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

这是因为 RowEditEnding (和 CellEditEnding)是在提交编辑之前执行的(请参阅此文档帖子),因此您可以根据需要停止或编辑更改,您可以获取已更改的数据,如此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>


推荐阅读