Catel (MVVM framework) ObservableCollection
本文关键字:ObservableCollection framework MVVM Catel | 更新日期: 2023-09-27 18:10:47
我正在使用Catel实现一个WPF应用程序。
我有一个从ObservableCollection
扩展的类,每次插入一个项目时,UI必须更新。
CODE (简化版):
public abstract class LogCollections : ObservableCollection<Log4NetLog> {
private readonly Object _locker;
protected LogCollections() {
_logChart = new LoggingLevelChart();
_locker = new object();
}
public object Locker {
get { return _locker; }
protected override void InsertItem(int index, Log4NetLog item) {
lock (_locker) {
base.InsertItem(index, item);
if (item == null) {
return;
}
Log4NetLog temp = item as Log4NetLog;
// Updating
if (temp != null) {
// Updating
}
} //UnLock
}
}
}
直到现在我一直使用BindingOperations。EnableCollectionSynchronization只在。net 4.5中可用。不幸的是,我不得不使用。net 4来编译代码。
我想知道,在Catel框架中是否有解决这类问题的方法。
更多信息:
For This Application性能是主要问题,因为我向集合中添加了许多item。
更新:
使用FastObservableCollection
解决了这个问题,然而,当我退出使用时,UI冻结了大约5-7秒。我猜,这是由Dispatcher
我已经手动覆盖了OnCollectionChanged
:
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) {
DispatcherHelper.CurrentDispatcher.BeginInvoke(new Action(() => base.OnCollectionChanged(e)),
DispatcherPriority.ContextIdle);
}
这不是一个好的解决方案。有没有更好的方法来避免这个问题?
你可以考虑在Catel:
中使用FastObservableCollection。using (fastCollection.SuspendChangeNotifications())
{
// TODO: Add and remove all your items here
}
一旦你退出使用,它就会传递它的更改通知
要解决线程问题,可以使用DispatcherHelper