【问题标题】:Subscribe weakly to events obtained by reflection弱订阅反射获得的事件
【发布时间】:2011-07-18 13:39:11
【问题描述】:

我正在使用 MVVM 模式在 WPF 中制作MessageBox 控件。这个MessageBox 将用于具有不同外观的多个应用程序中,因此理想情况下我希望将代码保持在代码隐藏之外。

我试图让MessageBox 在引发事件时出现,在MessageBox 的声明中指定。

例如,这将在应出现MessageBox 的窗口的 XAML 中指定。

<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 在主窗口的 View 被释放时不会被 GC。这意味着如果为主窗口创建另一个视图,则会创建另一个 MessageBox,因此如果引发事件,两个 MessageBoxs 都会显示。

我尝试使用WeakEventManager 来解决这个问题,但Weak Event Patterns documentation 指定WeakEventManager 的实现应该只处理一个事件——这意味着我不能使用事件名称创建ShowOnEventEventManager作为字符串属性并使用它进行订阅。

有没有人对解决此问题的最佳方法有任何想法?

【问题讨论】:

  • 该控件是否应该是一个叠加层,还是会显示一个MessageBox
  • @Will:这是一个覆盖 - 基本的 MessageBox 对我的需求来说不够灵活。
  • 既然您在 View 上订阅了一个事件,为什么不subscribe to another event 也一样,它会告诉您何时取消订阅?

标签: c# wpf mvvm weak-references


【解决方案1】:

弱事件不会解决您的问题,因为在 GC 决定运行之前您不会被取消订阅(除非您明确调用 GC.Collect())。正如 Will 在 cmets 中建议的那样,您可以尝试在适当的时间取消订阅,或者更简单的方法是让您的 MessageBox 在显示之前检查它是否为IsLoaded

我不会担心 MessageBox 中的代码隐藏,除非您知道它会损害其可重用性的某些原因。只要 MessageBox 的使用者有一个 MVVM 友好的 API,就可以让 MessageBox 代码直接引用它的视图。

【讨论】:

  • 感谢您和@Will,听Unloaded 工作很愉快:)
【解决方案2】:

PRISM EventAggregator 默认使用弱引用实现事件。您需要能够更改发布事件的代码以在您的应用中实现这一点。

链接页面上有适当的代码示例以及强制性流程图。事件聚合器使用起来相当简单:Publish 带有强类型的有效负载,Subscribe 可以在任意多的地方使用。 (它是free to download

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2015-05-24
    • 1970-01-01
    • 2019-06-29
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多