2015-03-03 139 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

相關問題