Объекты WCF Ria Services и INotifyPropertyChanged - PullRequest
2 голосов
/ 25 мая 2011

У меня проблема с тем, что событие PropertyChanged из сгенерированных объектов Ria Services не вызывается для всех свойств.

Когда я смотрю на сгенерированный код (на стороне клиента), я вижу, что мои сущности являются производными от объекта Entity , который реализует INotifyPropertyChanged . Я также вижу, что некоторые свойства, например свойство Id , вызывают событие PropertyChanged , а некоторые - нет.

Я не использовал шаблоны T4, поэтому были использованы настройки по умолчанию.

Итак, мой вопрос:

Есть ли параметр / атрибут, который я могу установить, чтобы событие PropertyChanged вызывалось для любых свойств сгенерированных клиентских объектов?

Буду признателен за любую помощь.

EDIT:

Вот пример свойства в автоматически сгенерированном клиентском файле, который не вызывает событие 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 Ответ

3 голосов
/ 26 мая 2011

Событие PropertyChanged инкапсулировано в RaiseDataMemberChanged ().Вы можете проверить это с помощью любого декомпилятора (.NET Reflector и т. Д.).

Методы RaiseDataMemberChanged и RaiseDataMemberChanging используются для уведомления структуры об изменениях для отслеживания изменений и переходов состояний.

Эти два свойства различны, поскольку свойство Id украшено атрибутом Key-Attribute.Я думаю, что свойства с этим атрибутом получают особую обработку из-за ассоциаций с другими объектами и различной автоматически генерируемой реализации, потому что нет необходимости отслеживать изменения или переходы при изменении.

Так что в вашем случае яПодумайте, есть еще одна проблема, почему ваше событие PropertyChanged (возможно) не запущено.

...