【问题标题】:How to dissable DependencyProperty callback如何禁用依赖属性回调
【发布时间】:2016-09-06 18:26:51
【问题描述】:

如何在 MyDP1_Changed 和 MyDP1_Changed 中禁用调用回调方法? 当我从其他回调方法更改值时,我需要禁用回调

class MyDependencyObject : DependencyObject
{

        public object MyDP1 {
           get{ return GetValue(MyDP1Property); }
           set{ return SetValue(MyDP1Property, value); }
        }

        public object MyDP2 {
           get{ return GetValue(MyDP2Property); }
           set{ return SetValue(MyDP2Property, value); }
        }

        public static readonly DependencyProperty MyDP1Property =
            DependencyProperty.Register("MyDP1", typeof(object), typeof(MyDependencyObject )
            , new UIPropertyMetadata(MyDP1_Changed));

        public static readonly DependencyProperty MyDP2Property =
            DependencyProperty.Register("MyDP2", typeof(object), typeof(MyDependencyObject )
            , new UIPropertyMetadata(MyDP2_Changed));

        private static void MyDP1_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.SetValue(MyDP2Property, e.NewValue);
        }

        private static void MyDP2_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.SetValue(MyDP1Property, e.OldValue);
        }
}

【问题讨论】:

  • 如果您想始终保持两个属性的值相同...为什么不只使用 1 个属性?
  • A PropertyChangedCallback 仅在属性值实际 更改时才会被调用。您的问题似乎是MyDP2_Changed 中的一个错字。它可能应该设置e.NewValue 而不是e.OldValue。那么就不会有无限递归了。
  • 这是一个简单的例子。当我从其他回调方法更改值时,我需要禁用回调
  • 当然,但这没有意义。如果确实需要,设置一个布尔标志。

标签: wpf silverlight data-binding dependency-properties


【解决方案1】:

好的,首先,你需要使用SetCurrentValue 而不是SetValue - 否则你会搞砸你的绑定。

其次,您可以使用这些方法来临时添加和删除回调

TypeDescriptor.GetProperties(d)["MyDP1"].RemoveValueChanged(d, MyDP1_Changed)

TypeDescriptor.GetProperties(d)["MyDP1"].AddValueChanged(d, MyDP1_Changed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多