Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Caliburn.Micro DataGrid单元在事件发生前未更新_C#_Wpf_Events_Datagrid_Caliburn.micro - Fatal编程技术网

C# WPF Caliburn.Micro DataGrid单元在事件发生前未更新

C# WPF Caliburn.Micro DataGrid单元在事件发生前未更新,c#,wpf,events,datagrid,caliburn.micro,C#,Wpf,Events,Datagrid,Caliburn.micro,我使用Caliburn.Micro测试了一个WPF应用程序。我正在尝试使用可编辑的DataGrid构建。当更新单元格/行时,数据将更新数据库 但我遇到的问题是,当触发我的RowEditEnding事件时。它在编辑行之前传递行中的信息。我想知道如何将更新后的信息传递给函数 任何帮助都将不胜感激。相关代码如下: 视图: <DataGrid x:Name="People" AutoGenerateColumns="False" CanUserReorder

我使用Caliburn.Micro测试了一个
WPF
应用程序。我正在尝试使用可编辑的
DataGrid
构建。当更新
单元格
/
时,数据将更新数据库

但我遇到的问题是,当触发我的
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());
        }

    }
} 
使用Caliburn.Micro;
使用制度;
使用System.Collections.Generic;
使用System.Collections.Specialized;
使用System.Windows;
使用System.Windows.Controls;
命名空间SqliteEncryptionTest.ViewModels
{
公共类ShellViewModel:屏幕
{
公共IObservableCollection\u人;
公共IObservableCollection人员{
获取{return\u people;}
设置{
_人=价值;
财产变更通知(()=>人);
} 
}
public void SavePeopleEdit(对象发送方)
{
如果(人!=null)
{
MessageBox.Show(People[3].LastName.ToString());
}
}
公共ShellViewModel()
{
LoadPeopleList();
}
私有void LoadPeopleList()
{
People=newbindablecolection(SqliteDataAccess.LoadPeople());
}
}
} 

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

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

这是因为RowEditEnding(和CellEditEnding)是在提交编辑之前执行的(请参阅),因此您可以根据需要停止或编辑更改,您可以获取已更改的数据,如图所示

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


这是否回答了您的问题@PavelAnikhouski我试图避免在
.xaml
视图的代码隐藏中使用代码。使用
cal:Message.Attach=“[Event RowEditEnding]=[Action SavePeopleEdit($this)]”
基本上是一样的。这很好,它只是在编辑真正开始之前运行。编辑后我需要数据,以便更新数据库。绑定中的设置
UpdateSourceTrigger=PropertyChanged
是否有帮助?我上面的评论中没有与caliburn.micro或INPC相关的内容,描述了何时更新绑定源,这已经在本文中得到了回答,只是今天早上尝试了一下。现在很有魅力。