【问题标题】:Binding to Queue<string>. UI never updates绑定到队列<string>。 UI 从不更新
【发布时间】:2011-05-15 01:52:23
【问题描述】:

我将ListBox 绑定到Queue&lt;string&gt;。当我将项目入队/出队时,ListBox 不会更新。

我有帮助入队/出队来提高属性更改

protected void EnqueueWork(string param)
{
    Queue.Enqueue(param);
    RaisePropertyChanged("Queue");
}

protected string DequeueWork()
{
    string tmp = Queue.Dequeue();
    RaisePropertyChanged("Queue");
    return tmp;
} 

【问题讨论】:

  • 如何将列表框绑定到队列?我收到一条错误消息,说它需要绑定到 IList 或 IListSource

标签: c# queue


【解决方案1】:

你实现了INotifyCollectionChanged 吗?您需要它来通知诸如从集合中添加或删除项目之类的操作。

这是队列的简单实现:

public class ObservableQueue<T> : INotifyCollectionChanged, IEnumerable<T>
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;
    private readonly Queue<T> queue = new Queue<T>();

    public void Enqueue(T item)
    {
        queue.Enqueue(item);
        if (CollectionChanged != null)
            CollectionChanged(this, 
                new NotifyCollectionChangedEventArgs(
                    NotifyCollectionChangedAction.Add, item));
    }

    public T Dequeue()
    {
        var item = queue.Dequeue();
        if (CollectionChanged != null)
            CollectionChanged(this, 
                new NotifyCollectionChangedEventArgs(
                    NotifyCollectionChangedAction.Remove, item));
        return item;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return queue.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

【讨论】:

  • 你的意思是否与@ArsenMkrt 相同,我应该创建一个扩展INotifyPropertyChanged 的ObservableQueue 或改用ObservableCollection?我想创建 ObservableQueue,因为它在语义上更正确。但我将如何去做呢?扩展队列并覆盖入队/出队?但是我会写什么,我需要什么财产来提高财产变化?
  • 您需要实现 INotifyCollectionChanged - 请参阅我的编辑以了解简单的实现
  • 我对此很陌生,如果我错了,请纠正我,但这会是更好的实现方式吗? pastebin.com/GggziXf6
  • 对于未来的读者,我不得不将两个 CollectionChanged 行更改为以下内容以避免异常:添加新项目:CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, queue.Count));。删除项目:CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, 0));。即您必须指定发生操作的项目索引。
【解决方案2】:

您应该使用 ObservableCollection 而不是队列来做您想做的事情,以允许 ListBox 更新项目添加和删除您的类应该实现 INotifyCollectionChanged,ObservableCollection 实现该接口,或者您可以编写实现 INotifyCollectionChanged 接口的自定义队列 (ObservableQueue)

This post可以帮忙

【讨论】:

  • 从我的窗口(数据上下文)提高属性更改还不够吗?我可以对 int 做同样的事情,我认为这不是可观察的?我想使用队列的原因是因为使用,我只需要入队和出队的东西,但没关系,我可以使用ObservableCollection仍然
  • 哦,顺便说一句,我将如何扩展 Queue 类以使其可观察?我尝试扩展 Queue&lt;T&gt; 然后当我想覆盖 Enqueue 时,我不知道该写什么
  • 没有@jiewmeng 这还不够,因为你的队列引用没有改变,但是队列的内容改变了......并且WPF没有更新引用,因为它没有改变
  • 查看我留下的关于如何使队列可变的参考...说实话我从来没有这样做过,你可以只使用 observablecollection,而不是创建队列
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 2015-03-04
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多