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;时,你只是给_customerobj一个新值,但DataContext仍然引用原始对象,所以它不会改变。

例如:

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,并且仍然在网格中更改对象,您可以包装您的属性(例如在 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 所建议的,您需要实现INotifyPropertyChanged以让 UI 知道数据已更改。

本教程以简单的方式详细介绍了如何。

于 2013-02-05T08:13:44.163 回答