Я делаю MessageBox
элемент управления в WPF, используя шаблон MVVM.Это MessageBox
будет использоваться во многих приложениях с разным внешним видом, поэтому в идеале я хочу сохранить код вне кода.
Я пытаюсь заставить MessageBox
появляться при возникновении события,указанный в объявлении MessageBox
.
Например, это будет указано в XAML окна, в котором должен появиться MessageBox
.
<dialog:MessageBox
ShowOnEvent="EventRaised"
EventContext="{Binding}"
Message="I am a message box"
IconType="Warning"
ButtonsType="YesNo" />
Способ, которым этов настоящее время работает: в MessageBox
ViewModel я использую отражение, чтобы получить EventInfo
для события, затем подписываюсь напрямую:
if (eventContext != null && showOnEvent != string.Empty)
{
EventInfo eventInfo = eventContext.GetType ().GetEvent (showOnEvent);
if (eventInfo != null)
{
eventInfo.AddEventHandler (eventContext, eventHandler);
}
else
{
Debug.WriteLine (string.Format ("Dialog: Couldn't find event {0} on {1}, check event name.", showOnEvent, eventContext));
}
}
Это показывает MessageBox
при возникновении события, какожидается.
Однако , обработчик события означает, что MessageBox
ViewModel не GC'd, когда расположен вид главного окна.Это означает, что если создается другое представление для главного окна, создается другое MessageBox
, поэтому, если событие вызывается, будут отображаться оба MessageBox
s.
Я попытался обойти это с помощью WeakEventManager
, но в документации Weak Event Patterns указано, что реализация WeakEventManager
должна обрабатывать только одно событие - это означает, что я не могу создать ShowOnEventEventManager
с именем события в качестве строкового свойства иподпишитесь на это.
У кого-нибудь есть идеи, как лучше всего это сделать?