我有一个带有字符串属性和List属性的简单类,我实现了INofityPropertyChanged事件,但是当我对字符串List执行.Add时,此事件未被命中,因此我在ListView中显示的Converter不是击中。我猜测属性已更改未被添加到列表中....我怎样才能实现此方法以获取该属性更改事件命中???
我是否需要使用其他类型的收藏?!
感谢您的帮助!
namespace SVNQuickOpen.Configuration
{
public class DatabaseRecord : INotifyPropertyChanged
{
public DatabaseRecord()
{
IncludeFolders = new List<string>();
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void Notify(string propName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
#endregion
private string _name;
public string Name
{
get { return _name; }
set
{
this._name = value;
Notify("Name");
}
}
private List<string> _includeFolders;
public List<string> IncludeFolders
{
get { return _includeFolders; }
set
{
this._includeFolders = value;
Notify("IncludeFolders");
}
}
}
}
答案 0 :(得分:35)
您应该使用ObservableCollection<string>
代替List<string>
,因为与List
不同,ObservableCollection
会在内容发生变化时通知家属。
在你的情况下,我只能_includeFolders
只读 - 你可以随时使用该集合的一个实例。
public class DatabaseRecord : INotifyPropertyChanged
{
private readonly ObservableCollection<string> _includeFolders;
public ObservableCollection<string> IncludeFolders
{
get { return _includeFolders; }
}
public DatabaseRecord()
{
_includeFolders = new ObservableCollection<string>();
_includeFolders.CollectionChanged += IncludeFolders_CollectionChanged;
}
private void IncludeFolders_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Notify("IncludeFolders");
}
...
}
答案 1 :(得分:7)
使WPF的列表绑定工作的最简单方法是使用实现INotifyCollectionChanged
的集合。这里要做的一件简单的事情就是使用ObservableCollection
替换或修改您的列表。
如果您使用ObservableCollection
,那么每当您修改列表时,它都会引发CollectionChanged事件 - 这个事件将告诉WPF绑定更新。请注意,如果换出实际的集合对象,则需要为实际的集合属性引发propertychanged事件。
答案 2 :(得分:2)
您的列表不会自动为您激活NotifyPropertyChanged事件。
公开ItemsSource
属性的WPF控件旨在绑定到ObservableCollection<T>
,将在添加或删除项目时自动更新。
答案 3 :(得分:1)
您应该查看ObservableCollection