防止MVVM ServiceAgent事件多次连接

时间:2011-05-11 05:29:31

标签: wcf events mvvm

开发与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模式中解除这些事件的最佳方法是什么?

2 个答案:

答案 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的内容。