【问题标题】:WeakEventManager & DependencyPropertyChangedEventArgsWeakEventManager & DependencyPropertyChangedEventArgs
【发布时间】:2013-01-08 13:58:52
【问题描述】:

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

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

【问题讨论】:

    标签: wpf .net-4.5 weakeventmanager


    【解决方案1】:

    使用 .NET 内置的PropertyChangedEventManager

    【讨论】:

    • 查看文档,它似乎正是我想要的。非常感谢!
    • 具有IsVisibleChanged的UIElement没有实现INotifyPropertyChanged,不能作为事件的源对象。
    • 目前尚不清楚这个答案如何实际解决相关问题。我添加了我自己的答案来澄清。
    【解决方案2】:

    我不确定使用“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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多