WPF 自定义控件中自定义依赖属性 Binding 失效的问题

原先控件的依赖属性写法如下

  public class MyControl : Control
    {
        public double MyWidth
        {
            get => (double)GetValue(MyWidthProperty);
            set => SetValue(MyWidthProperty, value);
        }

        public static readonly DependencyProperty MyWidthProperty =
            DependencyProperty.Register("MyWidth", typeof(double), typeof(Control), 
                new PropertyMetadata(0d));
    }

把属性 MyWidth Binding 到 ViewModel 的一个变量之中,一开始发现没什么问题,但是后来在 MyControl 这个对 MyWidth 进行修改之后发现 Binding 就失效了,ViewModel 不再能对 MyControl 中的 MyWidth 进行修改。

百度后发现原因是

https://ask.csdn.net/questions/677894
因为你的OneWayToSource 破坏了 t1的绑定 wpf绑定里面一旦建立了绑定 如果绑定源被第三方改变 这个绑定就会被破坏掉 你可以试试把你的t3 Mode也改为OneWay 不要用OneWayToSource 因为 OneWayToSource 其实改变了绑定源 t1和t2的绑定就被破坏了

而 new PropertyMetadata(0d) 所注册的依赖属性默认的 BindingMode 并不是 TwoWay。因此在 MyControl 里面修改了 MyWidth 之后这个绑定被破坏。

  • 解决办法一:

可以在Binding时这么写

   
  • 解决办法二(推荐):

修改默认的 BindingMode 为 TwoWay,用 FrameworkPropertyMetadata 替代 PropertyMetadata,并设置 BindsTwoWayByDefault 为 true

  public class MyControl : Control
    {
        public double MyWidth
        {
            get => (double)GetValue(MyWidthProperty);
            set => SetValue(MyWidthProperty, value);
        }

        public static readonly DependencyProperty MyWidthProperty =
            DependencyProperty.Register("MyWidth", typeof(double), typeof(Control), 
                new FrameworkPropertyMetadata(0d) { BindsTwoWayByDefault = true});
    }

你可能感兴趣的:(WPF,C#)