我有一个看起来大致如此的模型:
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();
}
}
}
显然,这看起来与原始服务器端属性不同。
答案 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