1

ローカルデータベースからデータを読み取り、リストボックスに表示するアプリケーションを作成しています(WPFで作業しています)。

私はDVDオブジェクトを持っており、そのプロパティはデータベースの列です。このDVDオブジェクトは、INotifyPropertyChangedも実装します。「MyDVDs」はdbを参照するテーブルです。これらのオブジェクトを作成したら、ObservableCollectionを継承し、コンストラクターの「MyDVDs」からデータを取得するクラスを作成します。ただし、リストボックスからデータを追加、削除、更新するだけでなく、データを並べ替えてフィルタリングする必要もあります。ObservableCollectionのコードは次のとおりです。

class ObservableDVD : ObservableCollection<DVD>
{
    private ICollectionView collection;

    public ObservableDVD(MyDVDs e)
    {
        foreach (DVD d in e.DVDs)
        {
            this.Add(d);
        }
        Collection = CollectionViewSource.GetDefaultView(this);
    }

    public ICollectionView Collection
    {
        get { return collection; }
        private set { collection = value; }
    }

}

知りたかったのですが、これはいい方法ですか?それとも私はもっとうまくやることができますか?

プロジェクトのメインウィンドウで、Load_Windowイベントが発生したときに、Collectionプロパティをlistbox.ItemSourceに割り当てます(メインウィンドウのコードビハインドで、明らかにObservableDVDオブジェクトを参照するプライベートフィールドを宣言します)。前に説明した操作を実行できるボタンがいくつかあります。ボタンのイベントヘッドラーでは、プロパティコレクションではなく、ObservableDVDオブジェクトを直接更新および変更します。ただし、Collectionプロパティにはこれらの変更も反映されます。

なぜこの動作が発生するのですか?私にとっては大丈夫ですが、なぜそれが起こるのか理解できません。通知のせいですか?

4

2 に答える 2

1

プロパティCollectionには、ObservableDVDのビューへの参照があります。参照であるということは、メモリ内の同じデータを指すことを意味します。

ObservableCollectionクラスアイテムが追加、削除されたとき、またはリスト全体が更新されたときに通知を提供する動的データコレクションを表します。

于 2012-12-27T13:43:15.423 に答える
0

指定するコレクションは、ObservableDVDコレクションの単なる「ビュー」です。つまり、両方が実際にメモリ内の同じデータを指しているのであり、2つの別個のものではありません。たとえば、コレクションにフィルターを適用する場合、「ビュー」はアイテムのサブセットになる可能性があります。

別の言い方をすれば、ObservableDVDにはデータセット全体の「データテーブル」が含まれ、ICollectionViewではカスタムロジックを介してユーザーに表示されるレコード/オブジェクトを操作できます。

于 2012-12-27T13:45:13.453 に答える