2011-05-11 88 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之外,但這應該正常工作。雖然我不明白爲什麼你要這樣將代碼放在首位。