向 List 添加项目时调用 INotifyPropertyChanged 不起作用,为什么?

Call to NotifyProportyChanged when adding items to List doesn't work, why?

我试图理解为什么每当添加到列表的项目不起作用时从 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);
    }
}

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

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

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

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

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