C# WPF Caliburn.Micro DataGrid单元在事件发生前未更新
我使用Caliburn.Micro测试了一个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
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相关的内容,描述了何时更新绑定源,这已经在本文中得到了回答,只是今天早上尝试了一下。现在很有魅力。