WPF DataGrid源更新单元格更改

问题描述:

我是WPF的新手,我使用它来构建销售点系统。WPF DataGrid源更新单元格更改

我有绑定到ItemObservableCollection主窗口,收银员将进入/扫描项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}" /> 
+0

+1更好地解决问题。其他单元格值应在单元上焦点丢失后立即更新,而不是焦点在行上丢失(默认)。 – retanik 2013-08-16 14:01:55

Almund是对的。 UpdateSourceTrigger=LostFocus将在您的情况下效果最好。正如你所提到的,当你移动到下一行时你的源代码正在更新,这意味着我猜你正在使用ObservableCollection<T>来绑定你的DataGridItemSource。因为那是你需要达到你想要的。

<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity, 
        Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 
<DataGridTextColumn Header="Total Price" Binding="{Binding TotalPrice, 
        Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 

您需要将"UpdateSourceTrigger=LostFocus"添加到每个列中。