2016-04-08 8 views
0

を発射ないて、CollectionChanged私はそうのObservableCollection <>

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

私のデータが細かい表示され、私は、グリッド内のデータを編集することができますようにのObservableCollectionにバインドされているWPFアプリでデータグリッドを持っていますが、それがありませんグリッド内のデータを手動で編集するときに、PublishSpringChangeイベントを発生させないでください。基礎となるデータは変更されますが、イベントは発生しません。何が欠けていますか?あなたが実際にコレクションを変更するとき

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

時々変わるすべてのプロパティに対して単一のハンドラを持つことは非常に便利です。あなたがそれを行う方法は次のとおりです。

_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のみ火災のSpringDataクラスに以下の

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オブジェクト内のプロパティの1つが変更されたときには起動しません。

SpringDataオブジェクトの変更をリッスンするには、INotifyPropertyChangedを実装すると仮定して、各アイテムのPropertyChangedイベントにリスナーを接続する必要があります。

+0

内からINotifyCollectionChangedトリップする方法はありますが、上記されているよう

ハンドルて、CollectionChanged SpringDataのイベントですか? – PlTaylor

+0

これを行う理由は何か特別な理由はありますか? – Cheesebaron

+0

私のコードは、コレクションの変更されたイベントをアイテムから通知するだけでなく、各アイテムがイベントを個別に処理するよりも、シンプルで堅牢です。 – PlTaylor

関連する問題