计算列更改时,WPF DataGrid刷新单元格

时间:2015-03-03 03:48:18

标签: c# wpf entity-framework datagrid observablecollection

尝试创建一个交互式网格,在用户键入值时更新计算列。理想情况下,当添加行并更改现有行时,计算出的只读单元格会在光标离开修改后的单元格时自动更新。理想情况下,当用户输入时,如果性能下降不是问题。

使用如下的实体数据模型:

public class CalculatorContext : DbContext
{
    public CalculatorContext() : base("name=CalculatorContext") { }

    public virtual DbSet<MyEntity> MyEntities { get; set; }
    public virtual DbSet<Calculation> Calculations { get; set; }
}

public class MyEntity
{
    public MyEntity()
    {
        Calculations = new ObservableCollection<Calculation>();
    }

    [Key]
    public int EntityId { get; set; }
    public string Name { get; set; }

    public virtual ObservableCollection<Calculation> Calculations { get; set; }
}

public class Calculation
{
    [Key]
    public int CalcId { get; set; }
    public int EntityId { get; set; }

    public int VariableX { get; set; }
    public int VariableY { get; set; }

    [NotMapped]
    public int Sum { get { return VariableX + VariableY; } }
    [NotMapped]
    public int Product { get { return VariableX * VariableY; } }

    public virtual MyEntity ParentEntity { get; set; }
}

以下网格仅在按该列排序(或保存并刷新)时刷新Sum和Product列:

    <DataGrid x:Name="calculationsDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" 
              Margin="30,30,30,70" RowDetailsVisibilityMode="VisibleWhenSelected" CellEditEnding="calculationsDataGrid_CellEditEnding" >
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="variableXColumn" Binding="{Binding VariableX}" Header="X" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="variableYColumn" Binding="{Binding VariableY}" Header="Y" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="sumColumn" Binding="{Binding Sum}" Header="Sum" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="productColumn" Binding="{Binding Product}" Header="Product" IsReadOnly="True"/>
        </DataGrid.Columns>
    </DataGrid>

从CellEditEnding事件调用DataGrid.Items.Refresh()只会导致“InvalidOperationException:在AddNew或EditItem事务期间不允许'刷新'。”我已经尝试在RowEditEnding,SourceUpdated和SelectedCellsChanged事件中添加一些逻辑,但是我不确定使用新计算(添加或乘以变量)来刷新屏幕的方法。实际上只需要刷新同一行上的2个只读单元格。

正如您所看到的,我正在使用ObservableCollection。我是否需要实施INotifiedChanges或类似的东西?如果是这样的话?

1 个答案:

答案 0 :(得分:1)

是的,要动态通知数据绑定控件的属性更改,您需要在集合中的元素上实现iNotifyPropertyChanged。然后,在构成计算属性更改的属性上,您还可以通知计算属性已更改。