5

我想知道将 WeakEventManager(4.5 很好)与提供 DependencyPropertyChangedEventArgs 的事件一起使用的最佳方法是什么。这些不是从 EventArgs 派生的(出于性能原因),因此 WeakEventManager 不能开箱即用。

任何指南、链接或提示将不胜感激!

4

2 回答 2

2

使用.NET 中内置的PropertyChangedEventManager 。

于 2014-06-01T21:27:44.033 回答
1

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

“PropertyChangedEventManager”适用于“PropertyChangedEventArgs”的实例,该实例派生自“EventArgs”,而“DependencyPropertyChangedEventArgs”则没有。这就是为什么标准方法不起作用的原因。

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

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;

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

于 2021-03-03T02:32:21.477 回答