c# - 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());
}
}
}
解决方案
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>
推荐阅读
- reactjs - 在通用 React 应用程序上存储 JWT 令牌
- ios - 如何在不同的故事板中对导航堆栈中的某些视图控制器执行推送 segue?
- python-3.x - 从两个列表创建 dict,具有 1:2 键:值关系
- python - 如何从字典中的字典中删除重复条目?
- r - 如何绘制 PCA 的前几个值
- functional-programming - 在 OCaml 中使用 GADT 时,如何删除函数上的“不太通用的定义”错误消息?
- c# - C#中泛型类型的继承
- node.js - 卡在 npm 错误
- ios - 在 iOS 上,allow-navigation 不优先于 allow-intent
- javascript - 单击时,将先前单击的图标切换回其原始状态