2016-04-08 48 views
0

我有一個WPF應用程序一個DataGrid綁定到一個ObservableCollection像這樣的ObservableCollection <> CollectionChanged不點火

<DataGrid ItemsSource="{Binding Spring.SpringData, Mode=OneWay}" /> 

我的數據顯示細膩,而且我可以在網格中編輯數據,但它確實當我手動編輯網格中的數據時,不會觸發PublishSpringChange事件。基礎數據發生變化,但事件並未觸發,我錯過了什麼?

隨着春天的一個模型,用SpringData類

public class SpringData: BindableBase 
{ 
    private double _force; 
    private double _displacement; 

    public SpringData(double displacement, double force) 
    { 
     Displacement = displacement; 
     Force = force; 
    } 

    public double Displacement 
    { 
     get { return _displacement; } 
     set { SetProperty(ref _displacement, value); } 
    } 

    public double Force 
    { 
     get { return _force; } 
     set { SetProperty(ref _force, value); } 
    } 
} 

回答

2

對於有時會更改所有屬性的單個處理程序非常有用。這是你如何做到的。

手柄CollectionChanged因爲你是上面:

_SpringData = new ObservableCollection<SpringData>(); 
SpringData.CollectionChanged += PublishSpringChange; 

現在所有的添加和刪除對象的集合的處理程序添加到的PropertyChanged:

private void PublishSpringChange(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    foreach (INotifyPropertyChanged added in e.NewItems) 
    { 
     added.PropertyChanged += SpringDataOnPropertyChanged; 
    } 

    foreach (INotifyPropertyChanged removed in e.OldItems) 
    { 
     removed.PropertyChanged -= SpringDataOnPropertyChanged; 
    } 
} 

private SpringDataOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) 
{ 
    //your code here 
} 
4

INotifyCollectionChanged僅火災有以下

public class Spring : INotifyPropertyChanged 
{ 

    private ObservableCollection<SpringData> _SpringData; 

    public ObservableCollection<SpringData> SpringData 
    { 
     get { return _SpringData; } 
    } 

    public Spring() 
    { 
     .... 

     _SpringData = new ObservableCollection<SpringData>(); 
     SpringData.CollectionChanged += PublishSpringChange; 

     ... 
    } 
    private void PublishSpringChange(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // Code that does not run! 
    } 
} 

當你真正修改集合。這是在添加,移除,移動,替換或重置集合中的項目時。當SpringData對象中的某個屬性發生更改時,它不會觸發。

爲了偵聽SpringData對象的變化,假設它實現了INotifyPropertyChanged,您需要將偵聽器連接到每個項目的PropertyChanged事件。

+0

有沒有辦法從內部的跳閘INotifyCollectionChanged SpringData中的事件? – PlTaylor

+0

有什麼特別的理由說明你爲什麼要這樣做? – Cheesebaron

+0

它使我的代碼更簡單,更強大,只需通知項目中收集的已更改事件,而不是讓每個項目分別處理事件。 – PlTaylor

相關問題