我必须在客户端上使用WPF进行双向通信,并使用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.
}
答案 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个属性:Sum
,First
和Second
。每当First
或Second
更改时,您还需要更新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
}