附加属性

自定义属性

Visual Studio 快捷方式:prop;

public int MyProperty { get; set; }

附加属性

附加是一种特殊的依赖属性。它允许给一个对象添加一个值,而该对象可能对这个值一无所知。
对控件非依赖属性的扩展,实现对非依赖属性的操作。
附加属性最常见的例子就是布局容器中DockPanel类中的Dock附加属性和Grid类中Row和Column附加属性。

定义

Visual Studio 快捷方式:propa;

public class OneControlHelper
{
    public static string GetMyProperty2(DependencyObject obj)
    {   
        return (string)obj.GetValue(MyProperty2Property);
    }
    public static void SetMyProperty2(DependencyObject obj, string value)
    {
        obj.SetValue(MyProperty2Property, value);
    }
    public static readonly DependencyProperty MyProperty2Property =
        DependencyProperty.RegisterAttached("MyProperty2", typeof(string), typeof(ownerclass), new PropertyMetadata("", OnMyProperty2Changed));

    private static void OnMyProperty2Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is OneControl control)
        {
            control.PropertyName = e.NewValue;
        }
    }
}

依赖属性

自定义的依赖属性可以绑定控件的依赖属性,实现控件的同步操作。

依赖属性与自定义属性的区别

当属性变化要执行一段动画 或者要动态加载、生成或布局模板中的子控件时,使用注册依赖属性,其他情况,可以使用普通自定义的.NET属性,也可以使用注册依赖属性,一般使用普通属性,这样简便一些。

定义

Visual Studio 快捷方式:propdp;

public class OneControlEx : UserControl / OneControl
  /// <summary>
  /// 属性值
  /// </summary>
  public double MyProperty3
  {
      get { return (double)GetValue(MyProperty3Property); }
      set { SetValue(MyProperty3Property, value); }
  }
  public static readonly DependencyProperty MyProperty3Property =
      DependencyProperty.Register("MyProperty3", typeof(double), typeof(ownerclass), new PropertyMetadata(0d, OnValueChanged));

  //public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("MyProperty3", typeof(double), typeof(ownerclass), 
  //    new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnValueChanged)));

  private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
      // 当对控件扩展时(OneControlEx),可以实现复杂的行为
      (d as ownerclass).Update();
  }
  private void Update()
  {
      // TODO
  }
}
posted @ 2020-07-13 18:37  wesson2019  阅读(442)  评论(0编辑  收藏  举报