2015-03-03 101 views
1

尝试制作一个交互式网格,用于在用户键入值时更新计算列。理想情况下,随着行的添加和现有行的更改,计算出的只读单元格会随着光标离开修改的单元格而自动更新。理想情况下,如果用户打字时性能下降不成问题。当计算列更改时,WPF DataGrid刷新单元格

与实体数据模型像这样:

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; } 
} 

当该列排序(或保存和更新)下面的网格只刷新点心和产品列:

<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事件添加一些逻辑,但我不确定要使用新计算刷新屏幕(添加或乘上变量)来调用什么方法。真的只需要刷新同一行上的两个只读单元格。

正如你所看到的,我正在使用ObservableCollection。我需要暗示INotifiedChanges还是类似的东西?如果是这样如何?

回答

1

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

+0

我已经实现了PropertyChanged,并且对Refresh的调用仍然会产生相同的InvalidOperationException:'Refresh'是不允许的。我的问题的主要部分是在事件触发后如何处理网格。像calculateDataGrid.Items.SourceCollection [e.PropertyName] .Refresh();会很棒,但那不行。理想情况下,它应该只刷新与触发更改事件的属性在同一行上计算的单元格。 – 2015-03-04 03:04:55

+0

事情是,一个正确实施的Inotifypropertychanged意味着你不需要调用刷新。基于数据绑定的对象更改应该自动冒泡到UIi – Tim 2015-03-04 03:56:52

+0

那么这是不是正确实施? 公共类计算:INotifyPropertyChanged { 公共事件PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) PropertyChangedEventHandler handler = PropertyChanged; if(handler!= null) { handler(this,new PropertyChangedEventArgs(name)); } } private int _variableX; public int VariableX { get {return _variableX; } set { _variableX = value; OnPropertyChanged(“VariableX”); }} – 2015-03-05 01:46:43

相关问题