Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到队列<;字符串>;。用户界面从不更新_C#_Queue - Fatal编程技术网

C# 绑定到队列<;字符串>;。用户界面从不更新

C# 绑定到队列<;字符串>;。用户界面从不更新,c#,queue,C#,Queue,我将列表框绑定到队列。当我对项目进行排队/出列时,列表框不会更新 我有助手排队/退队以提出财产变更 protected void EnqueueWork(string param) { Queue.Enqueue(param); RaisePropertyChanged("Queue"); } protected string DequeueWork() { string tmp = Queue.Dequeue(); RaisePropertyChanged("

我将
列表框
绑定到
队列
。当我对项目进行排队/出列时,
列表框
不会更新

我有助手排队/退队以提出财产变更

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

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

您应该使用ObservaleCollection not queue来执行您想要的操作,以允许ListBox更新项目添加和删除您的类应该实现INotifyCollectionChanged,ObservaleCollection实现该接口,或者您可以编写实现INotifyCollectionChanged接口的自定义队列(ObservaleQueue)


可以帮助

您是否实施了
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();
    }
}
公共类ObservableEQUEUE:INotifyCollectionChanged,IEnumerable
{
公共事件通知CollectionChangedEventHandler CollectionChanged;
私有只读队列队列=新队列();
公共无效排队(T项)
{
排队。排队(项目);
如果(CollectionChanged!=null)
收藏改变了(这个,
新NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add,item));
}
公共T出列()
{
var item=queue.Dequeue();
如果(CollectionChanged!=null)
收藏改变了(这个,
新NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Remove,item));
退货项目;
}
公共IEnumerator GetEnumerator()
{
返回queue.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}

从我的窗口(数据上下文)引发属性更改是否不够?我可以用int做同样的事情,我认为这是不可观察的?我之所以想使用queue是因为它的用法,我只需要排队和退队,但是没关系,我可以使用
observetecollection
stillOh,顺便问一下,我将如何扩展queue类以使其可观察?我尝试扩展
队列
然后当我想覆盖队列时,我不知道写什么@jiewmeng这是不够的,因为您的队列引用没有更改,但队列的内容已更改。。。WPF不会更新引用,因为它没有更改请参阅我留下的引用,了解如何使队列可更改。。。老实说,我从来没有这样做过,你可以只使用observablecollection,而不是创建Queue。你的意思是否与@ArsenMkrt相同,在@ArsenMkrt中,我应该创建一个扩展了INotifyPropertyChanged的
ObservableQueue
,或者改用observablecollection?我将创建ObservableEQUEUE,因为它更精确。但是我该怎么做呢?扩展队列并覆盖入/出队列?但是我要写什么?我需要什么属性来引发属性更改?您需要实现INotifyCollectionChanged-请参阅我的编辑以获得简单的实现我对这一点非常陌生,如果我错了,请纠正我,但这是实现这一点的更好方法吗?对于未来的读者,我必须将两行
CollectionChanged
更改为以下内容以避免出现异常:用于添加新项:
CollectionChanged?.Invoke(这是新的notifyCollectionChangedArgs(NotifyCollectionChangedAction.Add,item,queue.Count))。用于删除项:
CollectionChanged?.Invoke(此,新的NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove,项,0))。i、 e.您必须指定操作发生的项目索引。如何将列表框绑定到队列?我收到一个错误,说它需要绑定到IList或IListSource