使用INotifyPropertyChanged

时间:2017-01-12 09:22:17

标签: c# reference inotifypropertychanged

我有一个使用BasicHttpBinding的服务引用但是当使用VS生成reference.cs时,现在没有实现RaisePropertyChanged的一些属性(虽然这是可以接受的)并且setter中的逻辑被忽略/删除(这非常不是可接受!)。

我尝试以各种不同的方式配置服务引用并将逻辑放在RaisePropertyChanged事件中,但似乎没有任何事情可以解决这个问题。

任何帮助非常感谢,以下简要说明。

服务中的原始代码

public class Entry : INotifyPropertyChanged
{

    private string m_Firstname;
    private string m_Foo;

    public string Firstname
    {
        get { return m_Firstname; }
        set
        {
            m_Firstname = value;

            Foo = "bar";

            OnPropertyChanged("Firstname");
        }
    }

    public string Foo
    {
        get { return m_Foo; }
        set { m_Foo = value; }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null))
        {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }

}

Reference.cs中生成的代码

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1586.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.domain.com/")]
public partial class Entry : object, INotifyPropertyChanged {

    private string firstnameField;
    private string foo;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=1)]
    public string Firstname {
        get { return this.preferredContactMethodField; }
        set {
            this.firstnameField = value;
            this.RaisePropertyChanged("Firstname");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=2)]
    public string Foo {
        get { return this.foo; }
        set {
            this.foo= value;
            this.RaisePropertyChanged("Foo");
        }
    }


    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

请注意,在Firstname setter中设置Foo的尝试已经消失,并且出现了Foo setter中的RaisePropertyChanged。

据我所知,这是生成Reference.cs文件的过程的一部分,我无法做任何事情来让我的原始代码通过 - 尤其是设置Foo的尝试,是那是对的吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

添加服务引用时,将从服务接口自动生成客户端类型。您的特定逻辑是内部实现的一部分,服务客户端对此一无所知。

如果您想在客户端中使用此行为,则不应手动更改生成的代码。每当您更新参考时,它都会被覆盖。

唯一可行的解​​决方案是在单独的程序集中隔离服务类型,并在服务引用中使用此程序集。为此,在创建或更新引用时单击高级... 按钮,并在打开的对话框中包含程序集,方法是将其添加到&#34;使用这些程序集的类型&#34; 34;名单。