Prism EventAggregator Подпишитесь на делегат, который ссылается на Unsubscribe - PullRequest
0 голосов
/ 11 июля 2020

Можно ли сделать что-то вроде этого:

EventHandler handler = null;
handler = (s, args) =>
{
    DoStuff();
    something.SomeEvent -= handler;
};
something.SomeEvent += handler;

с помощью Prism's EventAggregator? ie

Action subscriber = null;
subscriber = () =>
{
    DoStuff();
    EventAggregator.GetEvent<SomeEvent>().Unsubscribe(subscriber);
};
EventAggregator.GetEvent<SomeEvent>().Subscribe(subscriber);

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Subscribe возвращает объект подписки, от которого вы можете отказаться:

IDisposable subscription = null;
subscription = eventAggregator.GetEvent<SomeEvent>().Subscribe( () =>
                                                                {
                                                                    // do something
                                                                    subscription.Dispose();
                                                                } );
1 голос
/ 11 июля 2020

Да, это также будет работать с агрегатором событий Prism. Все сводится к сравнению делегатов на равенство в обоих примерах. Обращение к делегату внутри анонимного метода не указывает c агрегатору событий.

Однако вы должны знать, что при использовании анонимных методов для такого типа одноразовой обработки событий работает, потому что вы удерживаете экземпляр делегата handler или subscriber, подписка на анонимные методы и отмена подписки на них может быть довольно сложной задачей в более сложном сценарии ios. Вам следует взглянуть на эти два вопроса, чтобы понять, как работает сравнение делегатов для анонимных методов.

В качестве альтернативы использованию анонимного метода вы можете использовать методы экземпляра или локальные функции которые были введены в C# 7.0 , как в следующем примере.

private void AddEventHandler()
{
   // Local method to replace your anonymous method
   void DoStuffAndUnsubscribe()
   {
      DoStuff();
      eventAggregator.GetEvent<SomeEvent>().Unsubscribe(DoStuffAndUnsubscribe);
   }

   eventAggregator.GetEvent<SomeEvent>().Subscribe(DoStuffAndUnsubscribe);
}

Как отметил @Haukinger, наиболее кратким способом является захват экземпляра токена подписки событие анонимного метода для отказа от подписки с использованием Dispose().

IDisposable subscriptionToken = null;
subscriptionToken = eventAggregator.GetEvent<SomeEvent>().Subscribe(() =>
{
    DoStuff();
    subscriptionToken.Dispose();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...