2011-12-06 11 views
4

部分クラスのSilverlightクライアント側でドメインクラスを拡張しました。具体的には、ボタンをバインドするRelayCommandプロパティを追加しました。 RelayCommandプロパティを初期化する必要があるため、その最適な場所はOnCreated部分メソッドにあるように見えます。部分的なメソッドOnCreatedが期待通りに呼び出されない

しかし、サーバからのオブジェクトがクライアントサイドでマテリアライズされたときに、そのコンストラクタが呼び出されていないときに収集します(これは完全に間違っているようです)。コンストラクタは呼び出されていないので、OnCreatedメソッドを呼び出さない。

オブジェクトがマテリアライズされるときにこのOnCreated部分メソッドを呼び出すための設定または慣例がありますか?

+0

私は、RIA Servicesの生成クラスに直接バインドするのではなく、独立したViewModelを作成するのです。とにかく、それは良い質問です、私も答えを知りたいです。 –

+0

@PavelGatilov私はあなたを大声ではっきりと聞いています。クラスがどのように生成されたか(OnCreatedなどを含む部分的なもの)の背後にある全体のアイデアは、クライアント、特にバインディングに最終的に適しているという唯一の目的でしたが、このようなナンセンスは私を不思議に思っています。 –

答えて

5

部分的なメソッドOnCreated()は、デフォルトコンストラクタを使用してエンティティをインスタンス化するときにのみ呼び出されます。

ロードされたエンティティを初期化する場合は、OnLoadedメソッドをオーバーライドする必要があります。エンティティが最初にロードされたかどうかを指定するブール値が渡されます。

+0

私はこの回答が気に入っていますが、私がしようとしていることは無関係に他のチャンネルから聞いたことがあります。私はまだ納得しています。 (Colin?)答えに+1し、チェックされたままにしておいてください。 –

+0

あなたは答えがあなたの質問に最も近いので、あなたは投票権を得るが、@colin大きな写真は私が今いる道である。 –

7

DataContractSerializationは、逆シリアル化するオブジェクトのコンストラクタを呼び出しません。この決定は、.NETの以前のシリアル化メソッドでは、シリアル化しようとしていたオブジェクトに常にデフォルトのコンストラクタを持たせる必要があったため問題がありました。これはRIA Servicesに固有のものではなく、WCF自体が作成されたときに行われた設計上の決定であり、WCFを変更する設定はありません。

詳細については、http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/06/wcf-extensibility-serialization-callbacks.aspxと[OnDeserialized]を使用して呼び出されるコンストラクタの効果を複製する方法の例を参照してください。

ただし、問題が発生する可能性のある2番目の問題があります。エンティティは常に構築されます。たとえば、TEntity.GetOriginalを呼び出すたびに、新しい分離エンティティが作成され、メソッドから返されます。これは、RelayCommandの潜在的なパフォーマンスと安定性の問題を構成するようなことをしようとします。 RelayCommandsは、エンティティ自体の内部ではなく、DataServiceまたはViewModelレベルで構成する方がよいでしょう。

+0

ありがとうございました。私のエンティティでRelayCommandを必要としたのは、DataGridの行にあるバインディングボタンを簡単に設定できるようにするためだけでした。大したことではなく、今私のボタンはViewModelのリレーコマンドにバインドし、コマンドパラメータとして行を渡します。これは最初に実行されていたはずです。今、あなたの答えと@jehofの両方を正しいものにするにはどうしたらいいですか? –

+0

ナー、それを@jehofに任せてください。私はOnLoadedメソッドを忘れていましたが、これは元の質問に対するより良い答えでした。良い説明のために私から –

+0

+1。 – Jehof

関連する問題