依赖属性更改回调 - 多次触发

8

我希望能监听DependencyProperty的变化。这段代码可以运行,但是每次重新加载带有CustomControl的页面后,回调函数会被多次调用...

public partial class CustomControl : UserControl
{
    public CustomControl()
    {
        InitializeComponent();
    }

    public bool IsOpen
    {
        get { return (bool)GetValue(IsOpenProperty); }
        set { SetValue(IsOpenProperty, value); }
    }

    public static readonly DependencyProperty IsOpenProperty =
        DependencyProperty.Register("IsOpen", typeof(bool), typeof(CustomControl), new PropertyMetadata(IsOpenPropertyChangedCallback));

    private static void IsOpenPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        Debug.WriteLine("Fire!");
    }
}

更新

视图模型(ViewModel)

private bool _isOpen;
public bool IsOpen
{
    get { return this._isOpen; }
    set { this.Set(() => this.IsOpen, ref this._isOpen, value); } // MVVM Light Toolkit
}

视图

<local:CustomControl IsOpen="{Binding Path=IsOpen}" />

示例

  • 项目

    1. 点击“第二页”
    2. 点击“真”(查看输出窗口)
    3. 返回
    4. 点击“第二页”
    5. 点击“假”(查看输出窗口)

XAML在哪里?你的属性上有绑定吗? - Eli Arbel
我已经添加了更多的信息。 - Jakub Krampl
3个回答

3
这解决了我的问题。
this.Unloaded += CustomControlUnloaded;

private void CustomControlUnloaded(object sender, RoutedEventArgs e)
{
    this.ClearValue(CustomControl.IsOpenProperty);
}

加一分鐘意。我在找一個佔用我的記憶體的東西,這樣做解決了問題。 - Abin

1
似乎事件触发的次数与打开带有控件页面的次数有关。这表明您有多个页面实例。
问题在于,您的页面正在执行某些操作,导致无法正确销毁它们。
不幸的是,如果不能查看代码,则无法确定原因。但很可能是您在代码中订阅了事件但未取消订阅(我在电话应用程序中经常看到这种情况)。

这绝对是有可能的。我也遇到过一两次,发现是没有在应该移除事件处理程序时进行移除。 - Brian Gideon

0
发生的情况是SecondPageView被多次加载。每次创建新实例时,它都会绑定到数据上下文并从视图模型检索IsOpen的值。然后设置依赖属性。
这实际上是期望的行为。如果不再设置属性,则视图模型的状态将不会反映在页面中。使用手机的本机导航API无法向前导航到旧页面实例。

好的,我明白了... 我能对这个行为做些什么吗? - Jakub Krampl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接