开发与WCF服务通信的Silverlight应用程序。
MVVM - > ServiceAgent - > WCF服务
所以在我的ViewModel中我有:
ServiceAgent.SearchExternalPatients(Name, (s, e) =>
{
ExternalPatients = e.Result;
});
在我的服务代理中我有:
public void SearchExternalPatients(string name, EventHandler<SearchPatientExternalCompletedEventArgs> callback)
{
_proxy.SearchPatientExternalCompleted += callback;
_proxy.SearchPatientExternalAsync(name);
}
问题是每当我点击搜索按钮时它再次挂起事件,当我得到结果时,我会多次收到它。
在MVVM ServiceAgent模式中解除这些事件的最佳方法是什么?
答案 0 :(得分:2)
这样做:
public void SearchExternalPatients(string name, EventHandler<SearchPatientExternalCompletedEventArgs> callback)
{
EventHandler<SearchPatientExternalCompletedEventArgs> wrapper = null;
wrapper = (s, e) =>
{
callback(s, e);
_proxy.SearchPatientExternalCompleted -= wrapper;
}
_proxy.SearchPatientExternalCompleted += wrapper;
_proxy.SearchPatientExternalAsync(name);
}
您可能会收到编译器或ReSharper或Visual Studio静态代码分析的警告(取决于每个的设置),因为lambda正在访问在lambda外部修改的变量,但这应该可以正常工作。虽然我不明白为什么你会首先以这种方式考虑代码。
答案 1 :(得分:1)
您是否可以使用Reactive Extensions来执行此操作?我没有用Silverlight做过很多事情,但是RX往往会减轻很多与事件挂钩/脱钩有关的痛苦。类似this example的内容。