2010-11-24 2 views
8

Ich habe eine ListBox an eine Queue<string> gebunden. Wenn ich Einträge in die Warteschlange einfüge/lösche, wird ListBox nicht aktualisiert.Bindung an Warteschlange <string>. Die Benutzeroberfläche wird nie aktualisiert.

Ich habe Helfer für enqueue/dequeue Eigenschaftsänderung

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

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

Wie binden Sie ein Listenfeld in eine Warteschlange? Ich erhalte eine Fehlermeldung, die besagt, dass es an eine IList oder IListSource gebunden werden muss. – vkapadia

Antwort

25

helfen Haben Sie INotifyCollectionChanged implementiert? Sie benötigen dies für Benachrichtigungen über Aktionen wie das Hinzufügen oder Entfernen von Elementen aus einer Sammlung.

hier ist eine einfache Implementierung für Warteschlange:

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(); 
    } 
} 
+0

Do you bedeutet das gleiche wie @ArsenMkrt, wo ich eine 'ObservableQueue' erstellen sollte, die' INotifyPropertyChanged' erweitert oder stattdessen ObservableCollection verwendet? Ich möchte ObservableQueue als semantisch korrekter erstellen. Aber wie soll ich das machen? Queue erweitern und Enqueue/Dequeue überschreiben? Aber woran werde ich schreiben und welche Eigenschaft muss ich ändern, um das Eigentum zu erhöhen? –

+0

Sie müssen INotifyCollectionChanged implementieren - siehe meine Bearbeitung für eine einfache Implementierung –

+0

Ich bin ziemlich neu, also korrigieren Sie mich, wenn ich falsch liege, aber wäre dies eine bessere Möglichkeit, dies zu implementieren? https://pastebin.com/GggziXf6 – vkapadia

1

Sie sollten ObservableCollection nicht zu tun Warteschlange verwenden zu erhöhen, was Sie wollen, List-Box zu ermöglichen, sich auf Elemente zu aktualisieren Hinzufügen und Ihre Klasse zu entfernen INotifyCollectionChanged implementieren sollten, ObservableCollection implementiert diese Schnittstelle, oder Sie können Ihre benutzerdefinierte Warteschlange (ObservableQueue) schreiben, die INotifyCollectionChanged Schnittstelle

This post implementiert, kann

+0

Ist die Eigenschaftsänderung von meinem Fenster (der Datenkontext) nicht ausreichend? Ich könnte das gleiche mit Int machen, was meiner Meinung nach nicht beobachtbar ist? Der Grund, warum ich die Queue verwenden wollte, ist wegen der Verwendung, ich muss nur Sachen ein- und auspacken, aber es ist in Ordnung, ich kann eine ObservableCollection immer noch verwenden –

+0

Oh, und wie werde ich die Queue-Klasse erweitern, um es zu machen beobachtbar? Ich habe versucht, die "Queue " dann erweitern, wenn ich Enqueue überschreiben wollte, weiß ich nicht, was zu schreiben –

+0

Nein @jiewmeng es ist nicht genug, weil Ihre Warteschlange Referenz nicht geändert wird, aber der Inhalt der Warteschlange geändert wird. .. und WPF aktualisiert Verweis nicht, weil es nicht geändert wird –

Verwandte Themen