2010-11-24 9 views
8

ListBoxQueue<string>にバインドしました。アイテムをエンキュー/デキューすると、ListBoxは更新されません。キューへのバインド<string>。 UIは更新されません

私は、

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

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

あなたがキューにリストボックスをバインドする方法を教えてください。 IListまたはIListSourceにバインドする必要があるというエラーが表示される – vkapadia

答えて

25

を助けることができ、あなたのカスタムキューINotifyCollectionChangedインターフェイスを実装(ObservableQueue)を書くことができます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(); 
    } 
} 
+0

@ArsenMkrtと同じ意味ですが、 'INotifyPropertyChanged'を拡張するObservableQueueを作成するか、代わりにObservableCollectionを使用する必要がありますか?私は、よりセメント的に正しいObservableQueueを作成したいと思います。しかし、私はそれをどうやってやるのでしょうか?キューを拡張し、エンキュー/デキューを上書きしますか?しかし、私は何に書いて、プロパティを変えるために必要なプロパティは変わるでしょうか? –

+0

あなたは、INotifyCollectionChangedを実装する必要があります - 簡単な実装のために私の編集を参照してください –

+0

私は間違っている場合は私にはかなり新しいですが、これを実装するより良い方法でしょうか? https://pastebin.com/GggziXf6 – vkapadia

1

プロパティの変更を高めるためにエンキュー/デキューのためにヘルパーを持っているあなたは、リストボックスは、あなたのクラスの追加と削除項目を更新できるようにするために、あなたがやりたいキューではないのObservableCollection使用する必要がありますINotifyCollectionChangedを実装する必要がありますObservableCollectionは、そのインタフェースを実装し、または

This post

+0

My Window(データコンテキスト)からプロパティを変更するだけでは不十分ですか?私はintと同じことをすることができます、私はそれが観察できないと思いますか?なぜキューを使用したかったのかという理由は、使用するためにエンキューとデキューする必要があるだけですが、そのオブジェクトはまだObservableCollectionを使用できます –

+0

ああ、btw、キュークラスをどのように拡張しますか観察できる?私は 'Queue 'を拡張しようとしましたが、Enqueueを上書きしたいときは、何を書くべきかわかりません。 –

+0

いいえ@jiewmengあなたのキュー参照は変更されていませんが、キューの内容は変更されます。 .. WPFは変更されていないため参照を更新しません –

関連する問題