【问题标题】:Call to NotifyProportyChanged when adding items to List doesn't work, why?向 List 添加项目时调用 INotifyPropertyChanged 不起作用,为什么?
【发布时间】:2018-10-05 11:06:48
【问题描述】:

我试图了解为什么在添加到列表的项目不起作用时从 AddNoteToList 调用 NotifyProportyChanged 的函数(下面的代码...)来更新视图。

当我在列表上做作业时效果很好,但如果我尝试添加项目然后手动调用NotifyProportyChanged,它就不行了。

我知道我应该使用ObservableCollection 来解决问题,但我想知道为什么我编写的这个实现不起作用。

public class MainWindowVM : INotifyPropertyChanged
{
    public Model.MainWindowModel Model { get; set; }

    public List<DataProtocol.Note> _notesListVM;
    public List<DataProtocol.Note> NotesListVM
    {
        get
        {
            return _notesListVM;
        }
        set
        {
            _notesListVM = value;
            NotifyProportyChanged("NotesListVM");
        }
    }



    //dp:
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyProportyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

    //Command: 
    public RelayCommand AddNoteCommand { get; set; }
    public void AddNoteToList(object parm)
    {
        string value = parm.ToString();
        NotesListVM.Add(new DataProtocol.Note(value));
        NotifyProportyChanged("NotesListVM");

    }

    public MainWindowVM()
    {
        Model = new PL.Model.MainWindowModel();
        NotesListVM = Model.NotesList;
        AddNoteCommand = new RelayCommand(AddNoteToList);
    }
}

【问题讨论】:

  • 因为列表的instance没有改变。 ObservableCollection 实现了 INotifiyCollectionChanged,视图使用它来等待列表内容的更新。

标签: wpf mvvm observablecollection inotifypropertychanged


【解决方案1】:

即使你提出PropertyChanged,对象实例NotesListVM实际上并没有改变,只有它的内容改变了。 WPF 已经优化到足以实现这一点并且什么都不做。

如果您真的想按照自己的方式进行操作,则需要每次都创建并分配一个新列表。

如你所说,改用ObservableCollection,这将触发CollectionChanged

【讨论】:

  • “您每次都需要创建并分配一个新列表”。并不真地。将属性设置为null 并重新分配以前的列表也可以。缺点是 ItemsControl 将不得不重新创建许多视觉项目,而不是添加一个
【解决方案2】:

ItemsControl.ItemsSource 是一个依赖属性,仅当您将值实际设置为不同的集合实例时才会注册更改 - 发送 PropertyChanged 事件是不够的。

如您所述,使用 ObservableCollection 是绑定 UI 的正确方法。控件检测到项目已从项目列表中添加/删除。

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多