4

私はを持っておりgrid、それDataContextはコードビハインドから割り当てられています:

CustomerDataGrid.DataContext = _customerobj;

一部の関数が実行されている場合、_customerobjオブジェクトは変更されます。

_customerobj = obj;

ただしDataContext、新しいオブジェクトの詳細に従って更新されません。以下を使用すると、更新されます。

_customerobj = obj;
CustomerDataGrid.DataContext = _customerobj;

_customerobjが更新されるたびに同じことを実行する必要がありますか、それとも何かを見逃したことがありますか?

4

3 に答える 3

5

あなたが経験していることは、実装していないことが原因ではありませINotifyPropertyChangedん。

を行うときは、を特定の値にCustomerDataGrid.DataContext = _customerobj;設定しています。DataContext後で設定するときは、新しい値_customerobj = obj;を指定するだけですが、元のオブジェクトを参照しているため、変更されません。_customerobjDataContext

例えば:

string a = "hello";
string b = a; // b points to "hello"
a = "world";  // a points to "world"
              // but b's pointer doesn't change

Console.WriteLine(b); // Outputs "hello"

これは、DataContextも設定する必要があることを意味します。

注:.NET文字列は不変であるため、これは実際には文字列に対して機能する方法ではありませんが、うまくいけば、これが重要な意味を持ちます。

于 2013-02-05T08:51:24.617 に答える
4

上記の@AdiLesterの答えは正しく、これが発生する理由です。
とはいえ、DataContextを1回だけ設定し、それでもグリッド内でオブジェクトを変更したい場合は、プロパティをラップし(たとえば、ViewModelで)、グリッドをプロパティにバインドしてから、プロパティが変更されるタイミングを指定します。グリッドも変更されます。

例えば:

public class MyViewModel : INotifyPropertyChanged
{
   private MyObj _customerObj;
   public MyObj CustomerObj
   {
       get { return _customerObj;}
       set
        {
            if (_customerObj != value)
            {
                _customerObj = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("CustomerObj"));
                }
            }
        }
   }
}

今、あなたはすることができます:

 MyViewModel vm = new MyViewModel();
 vm.CustomerObj = //Whatever;
 CustomerDataGrid.DataContext = vm;

そして、グリッドをバインドするときは、次のようにします。{Binding CustomerObj}

于 2013-02-05T09:05:48.630 に答える
0

@Johan Larssonが提案したように、データが変更されたことをUIに通知するには、INotifyPropertyChangedを実装する必要があります。

このチュートリアルでは、簡単な方法でその方法を詳しく説明します。

于 2013-02-05T08:13:44.163 に答える