尝试创建一个交互式网格,在用户键入值时更新计算列。理想情况下,当添加行并更改现有行时,计算出的只读单元格会在光标离开修改后的单元格时自动更新。理想情况下,当用户输入时,如果性能下降不是问题。
使用如下的实体数据模型:
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或类似的东西?如果是这样的话?
答案 0 :(得分:1)
是的,要动态通知数据绑定控件的属性更改,您需要在集合中的元素上实现iNotifyPropertyChanged。然后,在构成计算属性更改的属性上,您还可以通知计算属性已更改。