Сглаживаются службы и свойства Silverlight 3 RIA?

У меня есть модель, которая выглядит примерно так:

private bool IsProduct {get; set;}
private decimal ProductPrice {get; set;}
private decimal TimedRate {get; set;}

    public decimal SingularAmount {
        get {
            if (this.IsProduct) {
                return ProductPrice;
            }
            else {
                return TimedRate;
            }
        }
        set {
            if (this.IsProduct) {
                this.ProductPrice = value;
            }
            else {
                this.TimedRate = value;
            }
        }
    }

Я привязываюсь к этому свойству SingularAmount через службы RIA в Silverlight 3 DataGrid. Я обнаружил, что при изменении свойства соответствующие свойства модели не обновляются. Когда я просматриваю код, я вижу на стороне клиента, что SingularAmount установлен, например, на 5, другие свойства не обновляются.

Похоже, что когда RIA создает клиентскую версию классов, этот вид функциональности не переносится. Есть идеи, как с этим справиться?


Обновлять

Вот сгенерированный RIA код для этого свойства:

    [DataMember()]
    public decimal SingularAmount
    {
        get
        {
            return this._singularAmount;
        }
        set
        {
            if ((this._singularAmount != value))
            {
                this.ValidateProperty("SingularAmount", value);
                this.OnSingularAmountChanging(value);
                this.RaiseDataMemberChanging("SingularAmount");
                this._singularAmount = value;
                this.RaiseDataMemberChanged("SingularAmount");
                this.OnSingularAmountChanged();
            }
        }
    }

Очевидно, это не очень похоже на исходное свойство на стороне сервера.


person ChadT    schedule 11.08.2009    source источник


Ответы (3)


Когда вы выполняете привязку данных в Silverlight к стандартным свойствам CLR (в отличие от свойств зависимостей), объект привязки проверяет, реализует ли объект INotifyPropertyChanged и прослушивает события PropertyChanged.

Реализация этого в вашей модели приведет к правильному обновлению свойств привязки в пользовательском интерфейсе.

Однако есть одно предостережение: из-за способа реализации вашего свойства SingularAmount (рассчитанного на основе других значений) вам также необходимо уведомить пользовательский интерфейс об изменениях этого свойства.

Таким образом, в установщике ProductPrice вам нужно будет вызвать событие PropertyChanged для ProductPrice, а также для Singular Amount.

Этот http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspx обсуждает привязку данных в Silverlight и принцип работы уведомлений.

person Nigel Sampson    schedule 11.08.2009
comment
Спасибо, я попробовал ваше решение, однако RIA Services, сидящая посередине, вызывает некоторые головные боли. См. Мой обновленный вопрос, в котором показан код на стороне клиента, созданный службами RIA. - person ChadT; 11.08.2009
comment
Вы должны иметь возможность вводить желаемое поведение с помощью частичных классов и методов. Метод OnSingularAmountChanged является частичным методом, что означает, что вы можете реализовать его в частичном классе и поднять PropertyChanged для других свойств. Не идеально, поэтому мне не нравится код, созданный дизайнером. - person Nigel Sampson; 12.08.2009

Я только сам изучаю службы RIA, и мне интересно, можете ли вы в этом случае переопределить конструктор по умолчанию? Хотя я считаю, что для этого сценария рекомендуется использовать метод Setter (например, {obj} .SetPrice (decimal price); вместо того, чтобы делать то, что вы делаете ... Просто мои 0,02 доллара

person Richard B    schedule 11.08.2009

person    schedule
comment
Кажется, что shared.cs работает только для классов в том же проекте, что и RIA Services, а моя модель - нет. - person ChadT; 13.08.2009
comment
.общий. работает только в том случае, если файл находится в проекте на стороне сервера RIA Services. Причина, по которой вы не можете его использовать, связана с тем, что частичные классы работают только в одной сборке. Другой способ расширить вашу сущность (только на стороне клиента) - добавить частичный класс в проект на стороне клиента. - person Klinger; 13.08.2009
comment
Бизнес с общим кодом работает, однако обновление контекста домена перестает работать, если я изменю это свойство. - person ChadT; 16.08.2009
comment
Я могу подтвердить, что новые и правильные значения свойств отправляются по сети - просто метод обновления в моей службе RIA никогда не вызывается, если это свойство затронуто. Если я оставлю его в покое (и изменю некоторые другие стандартные), обновление будет работать нормально. - person ChadT; 16.08.2009
comment
Изменение закрытых полей не приведет к срабатыванию механизма отслеживания. Вы должны поменять недвижимость. Свойство, являющееся частью вашей сущности. Заданная часть свойства вызовет RaiseDataMemberChanged (PropertyName). Это изменит состояние объекта до тех пор, пока вы вызвали в нем BeginEdit (я имею в виду объект). Или вы сами называете это по заданному методу. this.RaiseDataMemberChanged (SingularAmount); Это должно сработать. - person Klinger; 16.08.2009