嘗試製作一個交互式網格,用於在用戶鍵入值時更新計算列。理想情況下,隨着行的添加和現有行的更改,計算出的只讀單元格會隨着光標離開修改的單元格而自動更新。理想情況下,如果用戶打字時性能下降不成問題。當計算列更改時,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還是類似的東西?如果是這樣如何?
我已經實現了PropertyChanged,並且對Refresh的調用仍然會產生相同的InvalidOperationException:'Refresh'是不允許的。我的問題的主要部分是在事件觸發後如何處理網格。像calculateDataGrid.Items.SourceCollection [e.PropertyName] .Refresh();會很棒,但那不行。理想情況下,它應該只刷新與觸發更改事件的屬性在同一行上計算的單元格。 – 2015-03-04 03:04:55
事情是,一個正確實施的Inotifypropertychanged意味着你不需要調用刷新。基於數據綁定的對象更改應該自動冒泡到UIi – Tim 2015-03-04 03:56:52
那麼這是不是正確實施? 公共類計算: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