3

に結合しません。エキスパンダーが展開されたら、内側のリストボックスのItemsSourceプロパティを設定します(これはバインドを使用するのではなく、この操作は非常に遅く、アイテムを表示するように選択した場合にのみ必要です)。内側のリストボックスはうまく描画されますが、実際にはコレクションのCollectionChangedイベントに登録されていません。私はIEnumerableの代わりにICollectionでこれを試しました。INotifyPropertyChangedを加え、INotifyCollectionChangedINotifyPropertyChangedに置き換えました。私が実際にこれを動作させる唯一の方法は、私のSomeCollectionクラスを抹消し、ObservableCollection<SomeItem>から継承することです。 ObservableCollectionの代わりに私自身のINotifyCollectionChangedの役割を果たそうとする私の推論は、実際のコードでCOMコレクションをラッピングするためです。そのコレクションは追加/変更/削除時に通知され、これらをWPF用のINotifyイベントに変換しようとしています。WPFリストボックスは、私は、次のテストコードを有するINotifyCollectionChangedまたはINotifyPropertyChangedのイベント

希望はこれで十分です(後半)。

+1

あなたは 'INotifyCollectionChanged'の動作を十分に実装しておらず、' INotifyPropertyChanged'を実装していないからです。 'ObservableCollection 'から継承するように 'SomeCollection'を変更して、あなたのために多くのことをやっている方が良いので、特定の理由を調べることはおそらく調査する価値がありません。なぜ車を再発明するのですか?必要に応じてメソッドをオーバーライドして、その動作をカスタマイズすることもできます。 –

+0

ラップしようとしているCOMコレクションの詳細がありますか?私はあなたのCOMコレクションをObservableCollectionに変換する方法を尋ねるべきだと思います。 – Iain

答えて

0

ObservableCollection<T>INotifyPropertyChangedを実装します。あなたが収集するのはIEnumerable<T>なので、イベントを作成するプロパティはありませんが、ObservableCollection<T>CountItem[]プロパティの場合はPropertyChangedイベントを作成してください。 IList<T>から派生し、INotifyPropertyChangedを実装して、コレクションをObservableCollection<T>のようにすることができます。私はそれがあなたの問題を解決するかどうかは分かりません。

+0

質問が正しく理解されていれば、コレクションは既に存在し、ObserverableCollectionでない基底クラスを持っています。このコレクションは、INotifyCollectionChangedを実装していても、リストボックスの更新時に強制的に更新されません。問題はなぜですか? –

0

なぜWPFで自分のコレクションを実装しようとしているのか分かりません。 ObservableCollection<SomeItem>を使用すれば、すべてのCollectionChanged通知が処理されます。

private ObservableCollection<SomeItem> collection = 
    new ObservableCollection<SomeItem>(); 

あなたはSomeItemがあなたて、CollectionChangedが提起されていない理由についてはINotifyPropertyChanged

を実装作る、SomeItem.PropertyChangedに起こるために何かをしたい場合、あなたはそれがを結合しない、ItemsSourceプロパティを設定されています。これは、collectionのコピーを作成してListBox.ItemsSourceに保存していることを意味します。バインドすると、ListBox.ItemsSourceにはcollectionを参照するように指示します。

+0

まあ、ObservableCollectionはソートを実装していません。したがって、ソートされた方法でデータを必要とする場合は、他のコレクションを拡張してINotifyCollectionChangedを実装する必要があります。 – Adarsha

+1

@Adarsha 'ObservableCollection 'を拡張して 'Sort'メソッドを含めるだけです。私はその動作のために 'ObservableCollection 'から継承するクラスを作成しません。 [この回答]でソートコードの例を見ることができます(http://stackoverflow.com/a/7285548/302677) – Rachel

+0

OPはObservableCollection を拡張せず、代わりにINotifyCollectionChangedを実装しようとしました。あなたはOnCollectionChangedを実装することを期待しています。 ObservableCollection.Moveは、すべてのバージョンの.NETで使用できるわけではありません。ウインドウズの電話。ソートを実装するには、ソートのためにホイールを再作成する必要があります。その中には、IList 、INotifyCollectionChangedを実装するクラスを使用するか、ObservableCollectionを使用して、最初から並べ替えることができます。 – Adarsha

関連する問題