предотвратить многократное подключение события MVAM ServiceAgent - PullRequest
3 голосов
/ 11 мая 2011

Разработка приложения Silverlight, которое связывается со службой WCF.

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);
    }

Проблема в том, что каждый раз, когда я нажимаю на кнопку поиска, она снова подключает событие, и когда я получаю результат обратно, я получаю его несколько раз.

Как лучше всего отсоединить эти события в шаблоне ServiceAgent MVVM?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Сделайте так:

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 (в зависимости от настроек каждого), потому что лямбда обращается к переменной, которая модифицируется вне лямбды, но это должно работать правильно. Хотя я не понимаю, почему вы бы сначала так кодировали код.

1 голос
/ 13 мая 2011

Не могли бы вы использовать Reactive Extensions для этого? Я не очень много сделал с Silverlight, но RX имеет тенденцию облегчать боль, связанную с перехватом / отсоединением событий. Что-то вроде в этом примере .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...