2011-05-11 82 views
3

开发与WCF服务通信的Silverlight应用程序。阻止多次连接MVVM ServiceAgent事件

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

如果我放置一个“_proxy.SearchPatientExternalCompleted - =回调;”之前的“_proxy.SearchPatientExternalCompleted + =回调;”解决了问题。但这是最好的方式吗? – BBurke 2011-05-11 05:30:12

+0

只要回调是每次调用的相同委托,它很可能会工作。但是,你想依赖那个巧合吗? – 2011-05-11 07:27:39

回答

1

你可能会利用Reactive Extensions来做到这一点吗?我没有用Silverlight做很多事情,但是RX倾向于缓解与事件挂钩/解钩有关的很多痛苦。一些沿着this example的行。

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之外,但这应该正常工作。虽然我不明白为什么你要这样将代码放在首位。