向 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 的正确方法。控件检测到项目已添加/从您的项目列表中删除。
我试图理解为什么每当添加到列表的项目不起作用时从 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 的正确方法。控件检测到项目已添加/从您的项目列表中删除。