1

我有一个看起来大致像这样的模型:

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 服务将这个 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();
            }
        }
    }

显然,这看起来不像原来的服务器端属性。

4

3 回答 3

1

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

在您的模型上实现此功能将导致绑定属性在 UI 中正确更新。

但是有一个警告,由于您的属性 SingularAmount 的实现方式(从其他值计算),您还需要通知 UI 有关该属性的更改。

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

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

于 2009-08-11T02:43:37.177 回答
1

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

为了让它工作,您需要创建一个扩展名为的新文件

.shared.cs(或 vb)。

此扩展告诉 RIA 服务将文件复制到客户端。

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

新财产。不要忘记调用 "this.RaisePropertyChanged("SingularAmount")" 所以

任何绑定到此属性的控件都会收到更改通知。

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

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

...

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

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

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

...

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

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

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

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

如何添加计算属性。

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

用心记录。:-)

于 2009-08-12T18:17:36.233 回答
0

我自己只是在学习 RIA 服务,想知道在这种情况下您是否可以覆盖默认构造函数?虽然,我相信这种情况下推荐的解决方案是有一个 Setter 方法(如 {obj}.SetPrice(decimal price); 而不是做你正在做的事情......只是我的 0.02 美元

于 2009-08-11T02:17:48.060 回答