WPF Caliburn.Micro DataGrid 单元格在事件之前未更新
WPF Caliburn.Micro DataGrid Cell not updating before Event
我有一个测试 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());
}
}
}
我将 LastName 更改为 "Four",但它仍然显示值为“4”。
这似乎是 Pavel Anikhouski 在对原始 post 的评论中暗示的,但我会澄清这一点作为答案。
这是因为 RowEditEnding(和 CellEditEnding)是在提交编辑之前执行的(参见 this doc post) so you can stop or edit change if you wish, you could grab the data that has been changed as shown in this
然而,最好的选择是将 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>
我有一个测试 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 在对原始 post 的评论中暗示的,但我会澄清这一点作为答案。
这是因为 RowEditEnding(和 CellEditEnding)是在提交编辑之前执行的(参见 this doc post) so you can stop or edit change if you wish, you could grab the data that has been changed as shown in this
然而,最好的选择是将 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>