WCF Ria Services实体和INotifyPropertyChanged

时间:2011-05-25 17:22:52

标签: silverlight wcf-ria-services inotifypropertychanged

我遇到的问题是,所有属性都没有为生成的Ria Services实体生成 PropertyChanged 事件。

当我查看生成的代码(客户端)时,我可以看到我的实体派生自实现 INotifyPropertyChanged Entity 对象。我还可以看到一些属性,如 Id 属性,正在引发 PropertyChanged 事件,但有些属性不是。

我没有使用任何T4模板,因此使用了默认值。

所以,我的问题是:

是否有可以设置的选项/属性,以便为生成的客户端实体的任何属性引发 PropertyChanged 事件?

任何帮助都将不胜感激。

编辑:

以下是自动生成的客户端文件中的属性示例,其中引发 PropertyChanged 事件:

    [DataMember()]
    [Required()]
    [StringLength(50)]
    public string FirstName
    {
        get
        {
            return this._firstName;
        }
        set
        {
            if ((this._firstName != value))
            {
                this.OnFirstNameChanging(value);
                this.RaiseDataMemberChanging("FirstName");
                this.ValidateProperty("FirstName", value);
                this._firstName = value;
                this.RaiseDataMemberChanged("FirstName");
                this.OnFirstNameChanged();
            }
        }
    }

这是模型服务器端

中定义的内容
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            OnFirstNameChanging(value);
            ReportPropertyChanging("FirstName");
            _FirstName = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("FirstName");
            OnFirstNameChanged();
        }
    }

以下是自动生成的客户端文件中的属性示例,确实引发 PropertyChanged 事件:

    [DataMember()]
    [Editable(false, AllowInitialValue=true)]
    [Key()]
    [RoundtripOriginal()]
    public Guid Id
    {
        get
        {
            return this._id;
        }
        set
        {
            if ((this._id != value))
            {
                this.OnIdChanging(value);
                this.ValidateProperty("Id", value);
                this._id = value;
                this.RaisePropertyChanged("Id");
                this.OnIdChanged();
            }
        }
    }

这是模型服务器端

中定义的内容
    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Guid Id
    {
        get
        {
            return _Id;
        }
        set
        {
            if (_Id != value)
            {
                OnIdChanging(value);
                ReportPropertyChanging("Id");
                _Id = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("Id");
                OnIdChanged();
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

PropertyChanged 事件封装在 RaiseDataMemberChanged ()中。您可以使用任何Decompiler(.NET Reflector等)进行检查。

RaiseDataMemberChanged和RaiseDataMemberChanging方法用于通知框架有关更改跟踪和状态转换的更改。

这两个属性不同,导致Id属性使用Key-Attribute进行修饰。我认为具有此属性的属性由于与其他实体的关联以及不同的自动生成实现而得到特殊处理,因为不需要跟踪更改或转换的转换。

所以在你的情况下,我认为还有另一个问题,为什么你的PropertyChanged事件(可能)没有被解雇。