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