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

この SingularAmount プロパティを RIA Services 経由で 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

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 に答える
1

Silverlight で標準の CLR プロパティ (依存関係プロパティではなく) にデータ バインディングを行う場合、バインディング オブジェクトは、オブジェクトが INotifyPropertyChanged を実装しているかどうかを確認し、PropertyChanged イベントをリッスンします。

これをモデルに実装すると、バインディング プロパティが UI で正しく更新されます。

ただし、プロパティ SingularAmount の実装方法 (他の値から計算される) により、そのプロパティへの変更についても UI に通知する必要があるという 1 つの注意点があります。

したがって、ProductPrice のセッターでは、ProductPrice と Singular Amount の PropertyChanged イベントを発生させる必要があります。

このhttp://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspxでは、Silverlight でのデータ バインディングと通知のしくみについて説明しています。

于 2009-08-11T02:43:37.177 に答える
0

私は自分で RIA サービスを学んでいるところですが、この場合、デフォルトのコンストラクターをオーバーライドできるかどうか疑問に思っていますか? ただし、このシナリオの推奨される解決策は、あなたがしていることを行う代わりに、Setter メソッド ({obj}.SetPrice(decimal price); のように) を使用することだと思います...ちょうど私の $0.02

于 2009-08-11T02:17:48.060 に答える