簡體   English   中英

ObservableCollection <> CollectionChanged未觸發

[英]ObservableCollection<> CollectionChanged Not Firing

我在WPF應用程序中有一個數據網格,該數據網格像這樣綁定到ObservableCollection

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

我的數據顯示正常,我可以編輯網格中的數據,但是當我手動編輯網格中的數據時,它不會觸發PublishSpringChange事件。 基礎數據發生更改,但事件未觸發,我還缺少什么?

使用具有以下內容的Spring模型

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類

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); }
    }
}

僅當您實際修改集合時才觸發INotifyCollectionChanged 這是您在集合中添加,刪除,移動,替換或重置項目的時間。 更改SpringData對象中的屬性之一時,它將不會觸發。

為了偵聽SpringData對象的更改,假定該對象實現了INotifyPropertyChanged ,則需要將偵聽器連接到每個項目的PropertyChanged事件。

有時為所有屬性設置單個處理程序非常有用。 這是您的操作方法。

如上所述,處理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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM