我有一个列表框:
<ListBox x:Name="lbxAF" temsSource="{Binding}">
从这个修改过的可观察集合中获取其数据:
public ObservableCollectionEx<FileItem> folder = new ObservableCollectionEx<FileItem>();
这是在一个使用FileSystemWatcher监视特定文件夹中的文件添加、删除和修改的类内创建的。
ObservableCollection被修改(因此在结尾处加上了Ex),以便我可以从外部线程修改它(代码不是我的,实际上我通过这个网站进行了一些搜索,并找到了它,运行得很好):
// This is an ObservableCollection extension
public class ObservableCollectionEx<T> : ObservableCollection<T>
{
// Override the vent so this class can access it
public override event System.Collections.Specialized.NotifyCollectionChangedEventHandler CollectionChanged;
protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
using (BlockReentrancy())
{
System.Collections.Specialized.NotifyCollectionChangedEventHandler eventHanlder = CollectionChanged;
if (eventHanlder == null)
return;
Delegate[] delegates = eventHanlder.GetInvocationList();
// Go through the invocation list
foreach (System.Collections.Specialized.NotifyCollectionChangedEventHandler handler in delegates)
{
DispatcherObject dispatcherObject = handler.Target as DispatcherObject;
// If the subscriber is a DispatcherObject and different thread do this:
if (dispatcherObject != null && dispatcherObject.CheckAccess() == false)
{
// Invoke handler in the target dispatcher's thread
dispatcherObject.Dispatcher.Invoke(DispatcherPriority.DataBind, handler, this, e);
}
// Else, execute handler as is
else
{
handler(this, e);
}
}
}
}
}
这个集合由以下内容组成:
public class FileItem
{
public string Name { get; set; }
public string Path { get; set; }
}
我可以存储文件的名称和路径。删除和添加文件方面,一切都很顺利,ListBox在这两个方面都无误更新了。但是,如果我更改任何一个文件的名称,它就不会更新ListBox。
我该如何通知ListBox文件项属性的更改?我认为ObservableCollection会处理这个问题,但显然它仅在添加或删除FileItem时引发标志,而不是当其内容发生更改时。