繁体   English   中英

WPF Caliburn.Micro DataGrid Cell 未在事件发生前更新

[英]WPF Caliburn.Micro DataGrid Cell not updating before Event

我有一个使用Caliburn.Micro的测试WPF应用程序。 我正在尝试使用可编辑的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”。

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>

暂无
暂无

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

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