Silverlight 3 RIA服务和财产被“夷为平地”?

时间:2009-08-11 01:36:41

标签: silverlight wcf-ria-services

我有一个看起来大致如此的模型:

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;
            }
        }
    }

我通过RIA Services绑定到这个SingularAmount属性到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();
            }
        }
    }

显然,这看起来与原始服务器端属性不同。

3 个答案:

答案 0 :(得分:1)

当你在Silverlight中对标准CLR属性进行任何数据绑定(而不是依赖属性)时,绑定对象会查看对象是否实现INotifyPropertyChanged并侦听PropertyChanged事件。

在模型上实现此操作将导致绑定属性在UI中正确更新。

但有一点需要注意,由于您的属性SingularAmount的实现方式(根据其他值计算),您还需要通知UI有关该属性的更改。

因此,在ProductPrice的setter中,您需要为ProductPrice和Singular Amount引发PropertyChanged事件。

http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspx讨论了Silverlight中的数据绑定以及通知的工作原理。

答案 1 :(得分:1)

1)如果实体模型与DomainServices在同一个项目中:

为了使其工作,您需要创建一个扩展名为

的新文件 .shared.cs(或vb)。

此扩展程序告诉RIA Services将文件复制到客户端。

在文件中,您可以扩展实体(使用partial)并添加

新财产。 别忘了调用“this.RaisePropertyChanged(”SingularAmount“)”so

绑定到此属性的任何控件都将获得更改通知。

因为您正在使用部分类,以及RIA共享代码的工作方式,所以

新文件必须与原始实体位于同一项目/程序集中。

...

2)如果实体模型位于不同的项目中:

使用new属性在客户端项目中创建一个分部类。

与上述概念相同,但新属性仅在客户端可见。

...

您可以在概述文档here上找到有关共享代码的更多信息。第34页。

第3章是关于客户端代码生成。知道的好消息。

另外,关于如何跨层共享代码的第12章(第97-103页),第17章

(第122-125页)代码生成挂钩点和第18章(第126-128页)如何添加

如何添加计算属性。

如果您认真使用.NET RIA服务,您可能应该知道这个

记录在心。 : - )

答案 2 :(得分:0)

我自己就是在学习RIA服务,我想知道你是否可以在这种情况下覆盖默认构造函数?虽然,我认为这个场景的推荐解决方案是使用Setter方法(如{obj} .SetPrice(十进制价格);而不是做你正在做的事情......只是我的$ 0.02