実際のサービス データをサービス機能から分離しようとしているため、複数のプロパティ (データ メンバー) を保持するデータ コントラクトとしてデータを返しています。クライアント コードは、プロキシ コードの INotifyPropertyChanged 実装も生成する svcutil /edb を使用して生成されます。私のテストで明らかになった限り、そのコードはサーバーで発生した変更に対して PropertyChanged イベントを呼び出しません。さらに、プロパティを取得すると、データ コントラクト プロキシが取得されたときと同様に、プロパティ値のみが返されます。
基本的に、ここに私が持っているものがあります:
(サーバ側)
[ServiceContract]
public interface IControllerService
{
[OperationContract]
DataModel GetDataModel();
}
[DataContract]
public class DataModel : INotifyPropertyChanged
{
private string _state;
[DataMember]
public string State
{
set
{
if (_state != value)
{
_state = value;
OnPropertyChanged("State");
}
}
get
{
return _state;
}
}
public event PropertyChangedEventHandler PropertyChanged;
[OperationContract]
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
(クライアント側)
private void Test()
{
ControllerServiceClient client = new ControllerServiceClient();
DataModel model = client.GetDataModel();
model.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(DataModelChanged);
Console.WriteLine(model.State);
// ... invoke something that forces the server to change the data model
// Output stays the same
Console.WriteLine(model.State);
}
private void DataModelChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
// This method never get called for server-side changes
}
データ コントラクト プロキシは、サーバーのデータ コントラクトに対する透過的なプロキシとして機能することを期待していますが、完全にバインドされていないようです。
よろしくお願いします。
ロムート