Как отписаться от Materialdesign события?

Возникла проблема с подписками на событие, так как на одно событие повесил 2 разных обработчика, один из обработчиков находится на Window, а второй обработчик на UserControl'e.

В итоге, что я имею:

(2 обработчика для разных событий в Window),

 <materialDesign:DialogHost DialogOpened="openLB" DialogClosing="closingLB">

(2 обработчика для тех же событий в UserControl'e).

<materialDesign:DialogHost DialogOpened="openCB" DialogClosing="closingCB">

И из-за этого, получается что идет вызов двух обработчиков для одного события, что вызывает за собой исключение в совершенно другом классе в методе openLB()

Код метода:

 private async void openLB(object sender, MaterialDesignThemes.Wpf.DialogOpenedEventArgs eventArgs)
    {
        await Task.Delay(2000);

        IsLogedIn = await validCreds();

        if (IsLogedIn)
        {
            eventArgs.Session.Close();
        }
        else
        {
            eventArgs.Session.Close(false);
        }
    }

На данной строке я ловлю исключение:

        else
        {
            eventArgs.Session.Close(false);
        }

Само исключение:

exception


То есть выходит такая иерархия вызово события (принадлежит событию DialogOpened) openCB() -> (принадлежит событию DialogClosing) closingCB() -> (вызов обработчика принадлежащего событию DialogClosing) closingLB() -> (вызов обработчика принадлежащему событию DialogOpened) openLB()

Видео с принципом работы прикрепил ниже, так как мог что-то упустить или плохо расписать

Вопрос конечный заключается в том, как отписаться от данных обработчиков и подписываться только при необходимости? Ибо как я понял тут не работает принцип с самописными event'ами

Видео для наглядности работы

Проект


Ответы (1 шт):

Автор решения: Bulson
else
{
    if (eventArgs.Session.IsEnded == false)
    {
         eventArgs.Session.Close(false);
    }
           
}
→ Ссылка