简单记录几个wpf学习上的问题[ObservableQueue]
我想给我的程序加一个下载队列,当我点击一个下载按钮的时候,他应该把这个插件信息(对象)加到一个队列中,然后队列里去实现下载和删除任务,下载完成则删除对象
首先我想到了Queue类型,然后我在我的viewmodel里定义了
private Queue<AddonDisplay> _addonQueue;
public Queue<AddonDisplay> AddonQueue
{
get { return _addonQueue; }
set { SetProperty(ref _addonQueue, value); }
}
当我向其添加Enqueue
元素的时候,发现没有效果!
一顿搜索,找到了两篇文章:
https://stackoverflow.com/questions/3127136/observable-stack-and-queue
https://stackoverflow.com/questions/40019395/implementing-own-observablecollection
原来是要实现:INotifyCollectionChanged
, INotifyPropertyChanged
两个接口!
PS. 其实在Google之前应该可以先看一眼
ObservableCollection
类的定义
最终实现代码如下:(我继承了ConcurrentQueue,一个从.net4开始出现的线程安全的queue)
class ObservableQueue<T> : ConcurrentQueue<T>, INotifyPropertyChanged, INotifyCollectionChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public event NotifyCollectionChangedEventHandler CollectionChanged;
public new void Enqueue(T item)
{
base.Enqueue(item);
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public new bool TryDequeue(out T result)
{
bool successed = base.TryDequeue(out result);
if (successed)
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
return successed;
}
}
这里有个小问题就是,我上面Enqueue的时候想使用NotifyCollectionChangedAction.Add,编译不通过,没仔细研究,反正这个Queue是用起来了。
然后在 viewmodel里将上面的Queue定义改成:
private ObservableQueue<AddonDisplay> _addonQueue;
public ObservableQueue<AddonDisplay> AddonQueue
{
get { return _addonQueue; }
set { SetProperty(ref _addonQueue, value); }
}
就可以了!