【问题标题】:.NET Callback Delegate Syntax in MVC for MVVMMVC 中用于 MVVM 的 .NET 回调委托语法
【发布时间】:2011-12-15 00:30:32
【问题描述】:

我正在学习 MVVM,因此我可以支持我的前任开发的应用程序。我遇到了this 很有帮助的文章。

文章中有一段代码看不懂,一直想弄明白:

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

以下是作者给出的解释:

调用 GetPeople 会调用服务代理上的方法,然后 传递一个回调委托。然后由 WCF 服务调用 服务代理并将结果分配给 People 属性。

所以我明白了

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

是一个回调委托,函数的结果被放入 this.People 中。但我不理解“(s,e)”的东西,通常很难掌握语法。

你介意解释一下吗?

【问题讨论】:

  • 这样更有意义吗? (object s, GetPeopleEventArgs e) => this.People = e.Result
  • 我认为这样会更清楚一点。所以“proxy.GetPeopleCompleted += callback;”意味着当代理完成返回一个值时,它会将 People 对象分配给 Result?我也不熟悉“+=”语法。

标签: .net delegates callback


【解决方案1】:

实际上正在发生的事情是:

1) ViewModel 被赋予一个 IServiceAgent 实例
2) ViewModel 将使用 IServiceAgent 获取和发送数据。 viewmodel 不知道如何获取数据,但会告诉 serviceagent 获取它。
3) IServiceAgent 并不意味着知道 ViewModel 或如何分配给它。

这是您的问题所在。代表在做什么,为什么需要 (s,e)。

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

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

为什么要这样做?

答案是因为您希望 IServiceAgent 更新 viewModel,但不具有对 ViewModel 的引用。怎么可能做到。好吧,它可以使用具有返回类型的普通方法来完成。但在这种情况下,您使用的示例文章希望异步返回其值。这可以通过传统方法完成,但它会阻止您的视图模型。实际上,您正在实施的是一个类似的事件。委托是事件的合同。因此,无论谁实现该事件,都必须遵守委托提供的合同,例如:

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

-或-

textbox.Click += new ClickHandler(myClickHandler);

void myClickHandler(Object sender, EventArgs args){}

-或-

textbox.Click += myClickHandler;

void myClickHandler(Object sender, EventArgs args){}

这些都符合点击事件(由事件委托定义)指定的合同。

如果你将它与文本框类中定义的内容进行比较,它看起来像:

Class TextBox{      
     event ClickEventHandler Click;    
     delegate ClickEventHandler (Object sender, EventArgs args);   
}

因此,这意味着要实现文本框单击事件,您必须提供一个方法,该方法具有 Object sender 的两个输入 EventArgs a 并具有 void 返回类型。此方法可以有任何名称。

您的问题中使用的 lambda 是 delgate。委托用于建立方法合同。您的 lambda 遵守合同,因此它是有效的。 (s,e) 的含义取决于您所遵守的合同的代表:

EventHandler<GetPeopleCompletedEventArgs> callback

我相信会产生类似的东西:

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

这似乎有点疯狂,要理解为什么很难看到 s 和 e 是什么,但智能感知应该(它适用于我的 resharper)显示 s、e 的类型。 (s,e) 的语法非常常见,第一个几乎总是与 .net 事件相同的是 (Object,EventArgs)

【讨论】:

  • += 是一种订阅语法。即一个事件将有一个订阅它的方法列表,+= 将添加一个订阅,就像 -= 将删除一个订阅一样。这在活动中很常见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多