0

私はまったくの初心者でDataContext、MVVM モデルの基礎を学んでいます。を実装するビューモデルオブジェクトにバインドされたグリッドを取得しましたINotifyPropertyChangedが、UpdateSourceTrigger(すべての WPF チュートリアルで使用するように指示されている) WinRT / Metro スタイル アプリでは使用できないようです!

INotifyPropertyChanged を実装するにはどうすればよいですか?

私はここで私のテザーの終わりにいます。私は、最も基本的なアプリの例にほぼ 1 日を費やし、何かをクリックした後にグリッドを更新しようとしました。これまでにこれを行うことができた唯一の方法は、ビューモデルのまったく新しいインスタンスを作成し、間違っていることがわかってDataContextいるを再割り当てすることです

アップデート:

私はある程度の進歩を遂げましたが、物事は非常に奇妙になりました。アイテムの一般的なリストを持つビューモデルがあります。項目リストは、PropertyChangedEventHandler に関連付けられています。コレクション全体を新しいものに置き換えると、リストビューが更新されます。

model.Items = new List<DataItem>{ new DataItem{ Title = "new item" }};

これにより、上記のアイテムを含む 1 つのアイテム リストが生成されます。ただし、アイテムを追加しようとしても何も起こりません

model.Items.Add(new DataItem{ Title = "added item" });

また、アイテムを追加して特にPropertyChangedを起動するメソッドを作成しようとしましたが、それも機能しません

ここが変なところです。次に、このコードを試しました。

model.Items.Add(new DataItem { Title = "added item" });
model.Items = new List<DataItem> { new DataItem { Title = "new item" }}; 

これにより、次の 2 つの項目リストが生成されます。

- new item
- added item

どうすればいいの?コードは「1つの項目を追加」してから「リスト全体を置き換える」と言っていますが、逆の順序で実行されますか?

更新 2:

提案どおり ObservableCollection に切り替えました。これにより、元の問題が実際に解決されました。アイテムを追加できるようになり、リストに表示されます。

ただし、新しい奇妙な動作は引き続き有効です。コレクションがリセットされる前に追加されたアイテムは、新しいコレクションの末尾に追加されます。コードが逆の順序で実行されるのはなぜですか?

4

2 に答える 2

3

気になる特定のプロパティが変更されたら、インターフェイスを実装し、通知を送信する必要があります。

        public event PropertyChangedEventHandler PropertyChanged;

        public string CustomerName
        {
            get
            {
                return this.customerNameValue;
            }

            set
            {
                if (value != this.customerNameValue)
                {
                    this.customerNameValue = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("CustomerName"));
                    }
                }
            }
        }

コレクションの場合、アイテムが追加または削除されたときに発生する処理を処理するため、 ObservableCollectionを使用する必要があることに注意してください。INotifyCollectionChanged

サンプルを可能な限り縮小することをお勧めします。DataGridではなく単純なTextBoxandButtonから始めないButtonでください。 は ViewModel の変更を強制し、UI に反映されます。

于 2012-09-21T14:19:27.940 に答える
3

ここから取られたコード。

次のように実装する親クラスを実装するのが最善です。

public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

そして、プロパティのサブクラス (ViewModel など) で次のようにします。

public class MyViewModel : NotifyPropertyChangedBase
{
    private string _name;
    public string Name {
      get{ return _name; }
      set{ 
       _name = value;
       RaisePropertyChanged("Name");
      }
    }
}
于 2012-09-21T14:24:22.947 に答える