在不触发OnPropertyChanged的情况下更新WPF DataGrid

时间:2016-05-04 18:09:49

标签: c# wpf wcf data-binding inotifypropertychanged

我必须在客户端上使用WPF进行双向通信,并使用WCF在服务器和客户端之间进行通信。有三个部分:

  • UI(用户可以键入值,MVVM模式中的视图)
  • 后面的客户端代码(MVVM模式中的ViewModel)
  • 远程WCF服务器,与视图模型通信。

当用户在UI中输入内容时,由于双向WPF数据绑定,该值会在视图模型中更新。视图模型将触发OnPropertyChanged事件。收听此事件后,视图模型会通知服务器更改。 这没关系!

走向其他方向是问题。如果服务器得到更新,我希望用户能够直接在UI中看到更改。服务器向视图模型发送数据。视图模型更新属性,以便UI可以显示该值。但是在设置此属性时,它会再次触发OnPropertyChanged事件,并且更改将再次发送到服务器。想想这样:

public int MyProperty
{
    get
    {
        return myProperty;
    }
    set
    {
        // Essentially, I want to know how to tell when the code enters here from the client typing on the UI, or from the server.
        myProperty = value;
        OnPropertyChanged("MyProperty");
    }
}

public void OnPropertyChanged(string propertyName)
{
    // send this property and its value to the server.
}

1 个答案:

答案 0 :(得分:0)

如果您无法更改服务器并且正在运行< .Net 4.5你可能不得不求助于反射并检查调用堆栈。从.Net 4.5开始,Caller Information methods可以提供帮助。

如果您能够修改服务器,那么让它使用不同的方法设置值,但为UI绑定的属性引发PropertyChanged

public int MyProperty
{
    get
    {
        return myProperty;
    }
    set
    {
        // Essentially, I want to know how to tell when the code enters here from the client typing on the UI, or from the server.
        myProperty = value;
        OnPropertyChanged("MyProperty");
    }
}

public void OnPropertyChanged(string propertyName)
{
    // send this property and its value to the server.
}

private void OnServerChangedMyProperty(int value)
{
    myProperty = value;
    OnPropertyChanged("MyProperty");
}    

更新 - 因为评论无法执行代码块

假设您有3个属性:SumFirstSecond。每当FirstSecond更改时,您还需要更新Sum。所以First的setter看起来像:

set
{
    _first = value;
    _sum = _first + _second;
    OnPropertyChanged("First"); //Update bindings to First
    OnPropertyChanged("Sum"); //Update bindings to Sum
}

Second的setter看起来像:

set
{
    _second = value;
    _sum = _first + _second;
    OnPropertyChanged("Second"); //Update bindings to Second
    OnPropertyChanged("Sum");  //Update bindings to Sum
}