Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖项属性已更改回调-多次触发_C#_Windows Phone 8 - Fatal编程技术网

C# 依赖项属性已更改回调-多次触发

C# 依赖项属性已更改回调-多次触发,c#,windows-phone-8,C#,Windows Phone 8,我想听听从属财产的变化。这段代码可以工作,但每次使用CustomControl重新加载页面后,都会多次调用回调方法 public partial class CustomControl : UserControl { public CustomControl() { InitializeComponent(); } public bool IsOpen { get { return (bool)GetValue(IsOpe

我想听听从属财产的变化。这段代码可以工作,但每次使用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
}
看法


样本

  • 点击“第二页”
  • 点击“真”(查看输出窗口)
  • 回去
  • 点击“第二页”
  • 点击“false”(查看输出窗口)

听起来,事件被触发的次数似乎与使用控件打开页面的次数有关。这表明您有多个页面实例

问题是你的页面确实在做一些事情,阻止它们被正确地破坏。

不幸的是,如果看不到代码,就不可能说出是什么导致了这种情况。这可能是因为您在代码中订阅了一个事件,而没有取消订阅。(我在手机应用程序中看到了很多。)

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


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

这解决了我的问题

this.Unloaded += CustomControlUnloaded;

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

XAML在哪里?你有这个属性的绑定吗?我已经添加了更多信息。好的,我明白了。。。我能对这种行为做些什么吗?这绝对是有道理的。这件事在我身上发生过一两次,我一直跟踪到在我应该删除事件处理程序的时候没有删除它。我在寻找侵蚀我记忆的东西。通过这样做来解决问题。
this.Unloaded += CustomControlUnloaded;

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