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!");
    }
}

更新

视图模型

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. 点击“true”(查看输出窗口)
    3. 回去
    4. 点击“第二页”
    5. 点击“false”(查看输出窗口)
4

3 回答 3

3

这解决了我的问题。

this.Unloaded += CustomControlUnloaded;

private void CustomControlUnloaded(object sender, RoutedEventArgs e)
{
    this.ClearValue(CustomControl.IsOpenProperty);
}
于 2013-10-10T20:40:17.403 回答
1

听起来好像触发事件的次数与您打开带有控件的页面的次数有关。这表明您有多个页面实例。

那么问题实际上是您的页面正在做一些阻止它们被正确销毁的事情。
不幸的是,如果看不到代码,就不可能说出是什么原因造成的。很可能您已经在代码中订阅了一个事件,但并未取消订阅它。(我在电话应用程序中看到了很多。)

于 2013-10-02T08:36:11.430 回答
0

发生的事情是SecondPageView多次加载。每次创建新实例时,它都会绑定到数据上下文并IsOpen从视图模型中检索 的值。然后设置依赖属性。

这实际上是期望的行为。如果没有再次设置属性,视图模型的状态将不会反映在页面中。无法使用手机的本机导航 API 向前导航到旧页面实例。

于 2013-10-02T08:57:30.663 回答