WPF DataGrid源更新单元格更改
我是WPF的新手,我使用它来构建销售点系统。WPF DataGrid源更新单元格更改
我有绑定到Item
的ObservableCollection
主窗口,收银员将进入/扫描项DataGrid
控制出售每个项目的默认数量为1,但它是可用于收银员更改数量手动。
每当我改变数量时,它应该更新总价格与项目的价格之和,当我离开细胞到行上的另一个细胞时,但它不会发生,只有当我更新来源时转到另一行而不是同一行中的另一个单元格。
有没有办法强制DataGrid
更新单元格更改时的源而不是行?
是的,这是可能的。你的问题是基本相同DataGrid - change edit behaviour
下面的代码大部分来自Quartermeister的答案,但我添加了一个DependencyProperty
BoundCellLevel可以设置当你需要一个DataGrid
结合当前单元格的变化时进行更新。
public class DataGridEx : DataGrid
{
public DataGridEx()
{
}
public bool BoundCellLevel
{
get { return (bool)GetValue(BoundCellLevelProperty); }
set { SetValue(BoundCellLevelProperty, value); }
}
public static readonly DependencyProperty BoundCellLevelProperty =
DependencyProperty.Register("BoundCellLevel", typeof(bool), typeof(DataGridEx), new UIPropertyMetadata(false));
protected override Size MeasureOverride(Size availableSize)
{
var desiredSize = base.MeasureOverride(availableSize);
if (BoundCellLevel)
ClearBindingGroup();
return desiredSize;
}
private void ClearBindingGroup()
{
// Clear ItemBindingGroup so it isn't applied to new rows
ItemBindingGroup = null;
// Clear BindingGroup on already created rows
foreach (var item in Items)
{
var row = ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;
row.BindingGroup = null;
}
}
}
接受的答案中的代码对我无效,因为从ItemContainerGenerator.ContainerFromItem(item)
获取的行结果为null,循环速度很慢。
的更简单的解决方案的问题是这里提供的代码: http://codefluff.blogspot.de/2010/05/commiting-bound-cell-changes.html
private bool isManualEditCommit;
private void HandleMainDataGridCellEditEnding(
object sender, DataGridCellEditEndingEventArgs e)
{
if (!isManualEditCommit)
{
isManualEditCommit = true;
DataGrid grid = (DataGrid)sender;
grid.CommitEdit(DataGridEditingUnit.Row, true);
isManualEditCommit = false;
}
}
应用UpdateSourceTrigger=LostFocus
到每个绑定。它对我来说就像一个魅力。
<DataGridTextColumn Header="Name" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
Almund是对的。 UpdateSourceTrigger=LostFocus
将在您的情况下效果最好。正如你所提到的,当你移动到下一行时你的源代码正在更新,这意味着我猜你正在使用ObservableCollection<T>
来绑定你的DataGrid
的ItemSource
。因为那是你需要达到你想要的。
<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity,
Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
<DataGridTextColumn Header="Total Price" Binding="{Binding TotalPrice,
Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
您需要将"UpdateSourceTrigger=LostFocus"
添加到每个列中。
+1更好地解决问题。其他单元格值应在单元上焦点丢失后立即更新,而不是焦点在行上丢失(默认)。 – retanik 2013-08-16 14:01:55