即使实现了INotifyProperty接口,ObservableCollection也不会刷新

时间:2010-12-13 02:20:12

标签: c# wpf data-binding

我有ObservableCollection绑定到列表框

public ObservableCollection<InsertionVM> Insertions
{
    get
    {
        return _insertions;
    }
    set
    {
        _insertions = value;
        base.OnPropertyChanged("ChromosomeList");
    }
}

其成员InsertionVM实现了INotifyPropertyChanged。它有一个将被更新的属性。

public bool IsChecked
{
    get
    {
        return _isChecked;
    }
    set 
    {
        _isChecked = value;
        base.OnPropertyChanged("IsChecked");
    }
}

为什么即使我为每个属性实现了INotifyPropertyChanged接口,ObservableCollection也不会刷新?


更新

我尝试了下面给出的链接,但只有删除/添加对象时才会更新“更敏感的集合”。

if (e.Action == NotifyCollectionChangedAction.Remove)
{
    foreach (InsertionVM item in e.NewItems)
    {
        //Removed items
        item.PropertyChanged -= EntityViewModelPropertyChanged;
    }
}
else if (e.Action == NotifyCollectionChangedAction.Add)
{
    foreach (InsertionVM item in e.NewItems)
    {
        //Added items
        item.PropertyChanged += EntityViewModelPropertyChanged;
    }
}

public void EntityViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    //Debugger does not reach here
}

构造

public ChromosomeVM(Chromosome _chr, string insertionFilePath)
{
    Chr = _chr;
    _insertions.CollectionChanged += ContentCollectionChanged;
}     

4 个答案:

答案 0 :(得分:2)

始终记住以下内容:

ObservableCollection<T>仅在number of items(可能保持相同,添加一个项目,删除一个项目,但您得到了重点)时通知{。<}>

如果ObservableCollection<T>中的项目发生更改,则集合不负责传播更改通知。

答案 1 :(得分:2)

这是你的代码:(请参见评论,由我制作)

public ObservableCollection<InsertionVM> Insertions // propertyName == Insertions
{
    get
    {
        return _insertions;
    }
    set
    {
        _insertions = value;
        base.OnPropertyChanged("ChromosomeList"); // What is ChromosomeList??
    }
}

你现在能看到问题吗?将ChromosomeList更改为Insertions。希望至少有一些问题能得到解决!

答案 2 :(得分:0)

请参阅ObservableCollection not noticing when Item in it changes (even with INotifyPropertyChanged) - 基本上您还需要挂钩CollectionChanged事件。

答案 3 :(得分:0)

务必将[插入]放在绑定的路径中,它将起作用

[插入]仅在您更改参考时才会更新。

Insertions = new ObservableCollection<InsertionVM>( Items);

为了使您的代码更有效,请检查集合中的值是否发生变化,如

public ObservableCollection<InsertionVM> Insertions
    {
        get
        {
            return _insertions;
        }
        set
        {
       if(_insertions != value)
           {
               _insertions = value;
               base.OnPropertyChanged("Insertions");
           }
        }
    }