4

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

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 
}

...在哪里退订?

4

1 回答 1

0

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

于 2021-08-12T21:32:04.527 回答