更改了单元格上的WPF DataGrid源更新

时间:2011-02-17 11:51:41

标签: wpf datagrid wpfdatagrid

我是WPF的新手,我用它来建立销售点系统。

我在主窗口中有一个DataGrid控件绑定到ObservableCollection Item,收银员将输入/扫描待售商品,每件商品的默认数量为1但收银员可以手动更改数量。

每当我更改数量时,它应该在我将单元格离开单元格到行上另一个单元格时使用项目价格的总和来更新总价格,但是不会发生,只有在我去的时候才会更新来源到另一行而不是同一行中的另一个单元格。

在更改单元格而不是行时,是否有强制DataGrid更新源?

4 个答案:

答案 0 :(得分:58)

UpdateSourceTrigger=LostFocus应用于每个绑定。它对我来说就像一个魅力。

<DataGridTextColumn Header="Name" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />

答案 1 :(得分:9)

接受的答案中的代码对我不起作用,因为从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;
 }
}

答案 2 :(得分:3)

是的,这是可能的。您的问题与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;
        }
    }
}

答案 3 :(得分:1)

Almund是对的。 UpdateSourceTrigger=LostFocus在您的情况下效果最佳。正如您所提到的,当您转到下一行时,您的来源正在更新,这意味着我猜您正在使用ObservableCollection<T>绑定DataGrid的{​​{1}}。因为这是你需要达到你想要的东西。

ItemSource

您需要在每个列中添加<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> <DataGridTextColumn Header="Total Price" Binding="{Binding TotalPrice, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />