7

ObservableCollectionWPF では、リスト内の項目を追加または削除することによってのみ GUI の変更が反映され、編集によっては反映されないことに気付きました。

つまり、代わりにカスタム クラス MyObservableCollection を作成する必要があります。この動作の理由は何ですか?

ありがとう

4

5 に答える 5

12

ObservableCollection には、含まれているオブジェクトに変更を加えたかどうかを知る方法がありません。これらのオブジェクトが変更されたときに通知を受け取りたい場合は、それらのオブジェクトも監視可能にする必要があります (たとえば、それらのオブジェクトに INotifyPropertyChanged を実装させることによって)。

于 2009-07-16T09:37:55.100 に答える
1

データ クラス オブジェクトの PropertyChanged イベントに対してビュー モデル クラスにメソッドを登録し、データ オブジェクトのプロパティの変更が発生したときにビュー モデルでそれらをリッスンできます。これは、監視可能なコレクションのアイテムが変更されたときに、View モデルでコントロールを使用するための非常に簡単で直接的な方法です。お役に立てれば...

于 2011-08-31T05:58:18.267 に答える
1

これを実現する別の方法は、DependencyObject から派生した新しい XXXViewModel クラスを実装し、これを ObservableCollection に配置することです。

これについては、この非常に優れた MVVM の紹介をご覧ください: http://blog.lab49.com/archives/2650

このようなクラスの例は次のとおりです。

public class EntryViewModel : DependencyObject
{
    private Entry _entry;
    public EntryViewModel(Entry e)
    {
        _entry = e;
        SetProperties(e);
    }

    private void SetProperties(Entry value)
    {

        this.Id = value.Id;
        this.Title = value.Title;
        this.CreationTimestamp = value.CreationTimestamp;
        this.LastUpdateTimestamp = value.LastUpdateTimestamp;
        this.Flag = value.Flag;
        this.Body = value.Body;
    }


    public Entry Entry
    {
        get {
            SyncBackProperties();
            return this._entry;
        }
    }


    public Int64 Id
    {
        get { return (Int64)GetValue(IdProperty); }
        set { SetValue(IdProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Id.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IdProperty =
        DependencyProperty.Register("Id", typeof(Int64), typeof(EntryViewModel), new UIPropertyMetadata(new Int64()));

}}

ここで重要なこと: - DependencyObject から派生します - DependencyProperties で動作して、WPF データバインディングをサポートします

br サルゴラ

于 2010-04-08T04:15:43.033 に答える
0

おそらく、アイテムが編集されたときにコレクションに警告する方法がないためです。つまり、アイテムが観察できない可能性があります。他のクラスも同様の動作をします。参照されているクラスのグラフのすべての変更を警告する方法はありません。

于 2009-07-16T09:40:29.930 に答える
0

回避策として、コレクションからオブジェクトを抽出し、処理が完了した後に再挿入することができます。ただし、要件と同時実行モデルによっては、これによりプログラムが醜くなる可能性があります。これは簡単なハックであり、品質を必要とするものには適していません。

代わりに、ContentChanged (名前がわからない) イベントを具体的にトリガーする update メソッドを使用してコレクションを実装できます。きれいではありませんが、少なくとも対処するのは非常に簡単です。

kragen2uk が言うように、理想的には、オブジェクトを監視可能にし、クライアント コードをクリーンでシンプルに保つことが最善です。

この質問も参照してください。

于 2009-07-16T09:47:49.370 に答える