2011-12-15 7 views
1

MVVMについて学んでいるので、前任者が開発したアプリケーションをサポートできます。役に立つとされているthisの記事を見に来ました。ここで MVC for MVVMの.NETコールバック代理構文

_ServiceAgent.GetPeople((s,e) => this.People = e.Result); 

は著者が与えるという説明である:私は理解していないと把握しようとしている記事のコードの部分があります

GetPeopleの呼び出しが行われ、サービスエージェントのメソッドが呼び出され、 はコールバックデリゲートを渡します。 WCFサービスは サービスエージェントによって呼び出され、結果はPeopleプロパティに割り当てられます。

は、だから私は

(s,e) => this.People = e.Result 

がコールバックデリゲートであることと、関数の結果はthis.Peopleに配置されていることを理解しています。しかし、私は "(s、e)"のことを理解しておらず、一般的に文法を理解するのに苦労しています。

説明しますか?

+0

これは意味がありますか? '(オブジェクトs、GetPeopleEventArgs e)=> this.People = e.Result' – ChaosPandion

+0

私はそれが少し明確になると思います。したがって、 "proxy.GetPeopleCompleted + = callback;"プロキシが値の返却を完了したときに、PeopleオブジェクトをResultに割り当てます。私は "+ ="構文にも慣れていません。 – Trevor

答えて

1

を効果的に起こっていることである:ビューモデルのビューモデルを取得しIServiceAgentでデータを送信しようとしているIServiceAgent
2)にインスタンスが与えられ

1)。 viewmodelはデータの取得方法を知らないが、サービスエージェントに取得するよう指示する。
3)IServiceAgentは、ViewModelまたはその割り当て方法を認識するためのものではありません。

これはあなたの質問が始まるところです。デリゲートは何をしていますか、なぜそれが(s、e)必要なのですか?

The (s,e) => {} is effectively a way of saying this: 

void anonymousMethod(Object s, EventArgs e){}; 

なぜこれが行われますか?

答えは、IServiceAgentでviewModelを更新し、ViewModelへの参照を持たないようにするためです。どのようにそれを行うことができます。それは戻り型の通常のメソッドを使って行うことができます。しかし、この場合、使用したサンプル記事では、その値を非同期的に返す必要があります。これはtradtionalメソッドで行うことができますが、あなたのviewmodelをブロックします。効果的にあなたが実装しているものは、同じようなイベントです。デリゲートはイベントの契約です。だから、誰でもイベントには、例えば、デリゲートが提供する契約に準拠するようにしている実装しています

textbox.Click += (s,e) => {((TextBox)s).Text = "Ive been clicked!"}; 

-OR-

textbox.Click += new ClickHandler(myClickHandler); 

void myClickHandler(Object sender, EventArgs args){} 

-OR-

textbox.Click += myClickHandler; 

void myClickHandler(Object sender, EventArgs args){} 

ものすべてがに準拠しますクリックイベント(イベントデリゲートによって定義される)によって指定されたコントラクト

あなたはテキストボックスクラスで定義されたものにすることを比較した場合、それはのようなものになりますので、あなたは、2つの入力を持つメソッドを供給する必要があるテキストボックスのクリックイベントを実装することを意味

をオブジェクト送信者のEventArgs aとvoid戻り値の型があります。このメソッドには任意の名前を付けることができます。

あなたの質問に使用されているラムダは、delgatesです。デリゲートはメソッド契約の確立に使用されます。あなたのラムダは契約に従うので、有効です。どのような(S、E)意味は、あなたがそれによって遵守されている契約のデリゲートまでのは、次のとおりです。

私のようなものが生成されます信じて
EventHandler<GetPeopleCompletedEventArgs> callback 

:これは少しクレイジーに見えるかもしれません

(Object Sender, GetPeopleCompletedEventArgs args) <-------> (s,e) 

をどうしてそんなに難しいのか理解できないのですが、intellisenseは(私がresharperと一緒に働く)は、sの種類を示します。 (s、e)の構文は非常に一般的で、最初のものは.netイベント(Object、EventArgs)とほとんど同じです

+0

+ =は購読構文です。つまり、イベントにはサブスクライブされているメソッドのリストがあり、+ =サブスクリプションを追加します.- =サブスクリプションを削除します。これはイベントでは非常に一般的です – Dessus