首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DataContracts上使用INotifyChanged

在DataContracts上使用INotifyChanged
EN

Stack Overflow用户
提问于 2010-01-25 23:08:32
回答 2查看 4.3K关注 0票数 1

我试图将实际的服务数据从服务功能中分离出来,因此将数据作为一个数据协定返回,其中包含几个属性(数据成员)。客户端代码是使用svcutil /edb生成的,svcutil还为代理代码生成INotifyPropertyChanged实现。据我的测试所示,对于服务器上发生的更改,该代码不会调用PropertyChanged事件。此外,获取属性只会在获取数据合约代理时返回属性值。

基本上,这是我得到的:

(服务器端)

代码语言:javascript
复制
[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));
    }
}

(客户端)

代码语言:javascript
复制
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
}

我期望数据契约代理充当服务器数据契约的透明代理,但它似乎是完全未绑定的。

万分感谢,干杯,

罗曼提

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-25 23:32:12

WCF不会神奇地生成到服务器端对象的挂钩。它只是调用ServiceContract中定义的任何方法,并将数据返回给您。除此之外,没有其他的沟通渠道。

因此,在您的场景中,您将需要一个双工服务(请参阅:http://msdn.microsoft.com/en-us/library/cc645027%28VS.95%29.aspx),该服务手动回调客户端,以获取来自服务器的任何更改。

票数 2
EN

Stack Overflow用户

发布于 2010-01-25 23:46:33

不要把DataContract看作一个“透明代理”,它更像是一个接口。

仅仅因为两个类实现了相同的接口,并不意味着它们做的是完全相同的事情。DataContract的客户端和服务器端也是如此。

客户端(这里)是基于DC生成的,还包括数据绑定方面的帮助,如INPC和ObservableCollections,就是这样,没有魔力。例如,如果您的服务器端对象上有一些已计算的属性,则该逻辑将不会出现在客户端。

如前所述,如果您需要服务器调用客户端上的事件,您将需要某种双向绑定/服务,没有其他方法(除了通过轮询服务器模拟它,等等)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2133150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档