【问题标题】:ObservableCollection does not refresh even if INotifyProperty interface is implemented即使实现了 INotifyProperty 接口,ObservableCollection 也不会刷新
【发布时间】:2011-05-24 10:41:43
【问题描述】:

我有一个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;
}     

【问题讨论】:

  • 请发布您的 xaml 绑定并添加您的集合未正确更新的操作。

标签: c# wpf data-binding


【解决方案1】:

这是你的代码:(也请看我的评论)

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

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

【讨论】:

  • 没注意到。这就是问题-_-
  • 为像我这样的粗人拼写出来。显然,您是说传递给 OnPropertyChanged 的​​字符串很重要。它的价值究竟应该是多少?集合实例的名称?
  • @PeterWone:不。属性的名称,而不是实例的名称。在本例中,实例为_insertions,但属性为Insertions
【解决方案2】:

永远记住以下几点:

ObservableCollection&lt;T&gt; 仅在 number of items 发生变化时通知(它可能保持不变,当添加一项并删除一项时,但你明白了)其中的变化。

如果ObservableCollection&lt;T&gt; 中的项目发生更改,集合不负责传播更改通知。

【讨论】:

  • Jack 提供的链接中ObservableCollection&lt;T&gt; 上的自定义实现将解决此问题。
【解决方案3】:

一定要把[Insertions]放在绑定的路径中,它会起作用的

[Insertions] 只有在您更改引用时才会更新。

Insertions = new ObservableCollection<InsertionVM>( Items);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2022-11-17
    • 2013-02-06
    相关资源
    最近更新 更多