【问题标题】:wpf attached property: where to unsubscribe from event handling?wpf 附加属性:在哪里取消订阅事件处理?
【发布时间】:2013-06-26 06:52:22
【问题描述】:

我有一个依赖属性 (bool),它可以在文本框中启用行为。 属性更改回调订阅了一些事件处理程序:

static void MyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is TextBox && e.NewValue != null)
        {
            var tb = d as TextBox;

            if ((bool)e.NewValue)
            {
                tb.Loaded += TextBox_OnLoaded;
                tb.MouseLeftButtonDown += TextBox_OnMouseLeftButtonDown;
            }
            else
            {
                tb.Loaded -= TextBox_OnLoaded;
                tb.MouseLeftButtonDown -= TextBox_OnMouseLeftButtonDown;
            }
        }
    }

在我的 Xaml 中,我有:

<TextBox
        customdp:MyTextBoxBehavior.EnableBehavior="True">
</TextBox>

离开这个,行为正常。但是退订永远不会被执行! 那么我必须放在哪里:

customdp:MyTextBoxBehavior.EnableBehavior="False"

???

这是另一种情况: 2)我有一个列表视图,并在 OnLoaded() 中订阅了可视树中子项的事件。原因:我不想为每个 listviewitem 添加附加属性。

static void ListView_OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var lv = sender as ListView;
        if (lv != null)
        {
            foreach (TextBox tb in lv.Items)
            {
                 tb.LostFocus += TextBox_OnLostFocus;
            }
        }
    }

想法:取消订阅:

ListView_OnUnLoaded(..)
{
   // Items already empty 
}

...在哪里退订?

【问题讨论】:

  • 您为什么要退订以及何时退订?我能弄清楚的唯一原因是关闭窗口?
  • 窗口在一个带有 1..n 个选项卡的 TabControl 内,可以动态创建和关闭。所以我想我需要取消订阅垃圾回收。
  • 那么当标签页关闭时你为什么不取消订阅呢?
  • 我无法访问标签关闭代码,它在另一个模块中。取消订阅必须在行为中。因此,我尝试捕获诸如“UnLoaded”之类的事件,这些事件告诉我 UIElement 将从可视树中删除。在我上面的例子中,我想取消订阅的子项已经被删除了,然后我不能删除处理程序。
  • 我也使用 Unloaded 并且工作正常 (Y)

标签: c# wpf events attached-properties unsubscribe


【解决方案1】:

在您可以使用tb.Loaded += 的那一刻,您也可以访问tb.Unloaded。借此机会添加您的清理代码,这将取消订阅 Loaded 事件 - Unloaded 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2021-03-29
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多