Wcf 防止MVVM ServiceAgent事件多次挂接

Wcf 防止MVVM ServiceAgent事件多次挂接,wcf,events,mvvm,Wcf,Events,Mvvm,开发与WCF服务通信的Silverlight应用程序 MVVM->ServiceAgent->WCF服务 因此,在我的ViewModel中,我有: ServiceAgent.SearchExternalPatients(Name, (s, e) => { ExternalPatients = e.Result; }); 在我的服务代理中,我有: public voi

开发与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);
    }
public void SearchExternalPatients(字符串名称,EventHandler回调)
{                          
_proxy.searchPatientTexternalCompleted+=回调;
_proxy.searchPatientTexternalAsync(名称);
}
问题是每次我点击搜索按钮时,它都会再次连接事件,当我返回结果时,我会多次收到它


在MVVM ServiceAgent模式中,解除这些事件锁定的最佳方式是什么?

您是否可以利用反应式扩展来实现这一点?我在Silverlight方面做得不多,但RX可以缓解与事件挂钩/取消挂钩相关的许多痛苦。类似的东西。

这样做:

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);
}
public void SearchExternalPatients(字符串名称,EventHandler回调)
{
EventHandler包装器=null;
包装器=(s,e)=>
{
(s,e);
_proxy.searchPatientTexternalCompleted-=包装器;
}                          
_proxy.searchPatientTexternalCompleted+=包装器;
_proxy.searchPatientTexternalAsync(名称);
}

您可能会从编译器、ReSharper或Visual Studio的静态代码分析(取决于每个的设置)中得到警告,因为lambda正在访问在lambda外部修改的变量,但这应该可以正常工作。虽然我不明白为什么您首先会这样考虑代码。

如果我在“\u proxy.searchPatientTexternalCompleted-=callback;”之前放置一个“\u proxy.searchPatientTexternalCompleted-=callback;”就解决了问题。但这是最好的方法吗?只要回调在每次调用中都是相同的委托,这种方法就可以工作,很可能是这样。但是你想依靠这个巧合吗?