WCF Ria Services entities and INotifyPropertyChanged



我遇到一个问题,生成的Ria Services实体中的PropertyChanged事件没有为所有属性引发。

当我查看生成的代码(客户端)时,我可以看到我的实体是从实现INotifyPropertyChangedEntity对象派生的。我还可以看到,一些属性,如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();
            }
        }
    }

PropertyChanged事件封装在RaiseDataMemberChanged()中。你可以用任何解压缩程序(.NET反射器等)来检查这一点。

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

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

因此,在您的情况下,我认为还有另一个问题,为什么您的PropertyChanged事件(可能)没有被激发。

相关内容

  • 没有找到相关文章

最新更新