WeakEventManager& DependencyPropertyChangedEventArgs

时间:2013-01-08 13:58:53

标签: wpf .net-4.5 weakeventmanager

我想知道什么是使用WeakEventManager(4.5很好)和提供DependencyPropertyChangedEventArgs的事件的最佳方式。这些不是从EventArgs派生的(出于性能原因),因此WeakEventManager无法正常运行。

任何指南,链接或提示都将受到高度赞赏!

2 个答案:

答案 0 :(得分:3)

使用.NET内置的PropertyChangedEventManager

答案 1 :(得分:0)

我不确定使用“PropertyChangedEventManager”如何解决有关“WeakEventManager”和绑定使用“DependencyPropertyChangedEventArgs”的弱事件处理程序的问题。

“PropertyChangedEventManager”与“PropertyChangedEventArgs”的实例一起使用,该实例派生自“EventArgs”,而“DependencyPropertyChangedEventArgs”则不然。这就是标准方法不起作用的原因。

在这种情况下,您始终可以使用手动方法(在“MyType”类的范围内声明“WeakEventHandler”):

private class WeakEventHandler
{
    private readonly System.WeakReference<MyType> m_WeakMyTypeRef;
        
    public WeakEventHandler(MyType myType) => m_WeakMyTypeRef = new System.WeakReference<MyType>(myType);

    public void OnClientIsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs args)
    {
        if (m_WeakMyTypeRef.TryGetTarget(out var myType))
            myType.OnClientIsKeyboardFocusWithinChanged(sender, args);
    } 
}

和绑定代码(来自“MyType”方法):

var weakEventHandler = new WeakEventHandler(this);
frameworkElement.IsKeyboardFocusWithinChanged += weakEventHandler.OnClientIsKeyboardFocusWithinChanged;

缺点是您必须声明一个新的(私有)类,尽管同一个类可以处理多个事件。