当前位置: 首页 > news >正文

第二章-依赖属性

1、依赖属性

  依赖属性使用效率更高的保存机制,并支持附加功能,如更改通知(change notification)以及属性值继承(在元素树中向下传播默认属性值的能力)。

  依赖项属性也是WPF许多重要功能的基础,包括动画、数据绑定以及样式,在代码中仍可以使用与读取和设置传统的.NET属性相同的方式来读取和设置依赖项属性。

 

2、应用场景

  1、要求属性支持绑定

  2、自定义/拓展控件属性

  3、支持验证/强制回调

  4、属性继承

  5、附加属性

 

3、依赖属性定义

  VS当中使用propdp可创建依赖属性

    public class Dp:DependencyObject{//定义public static readonly DependencyProperty AgeProperty;//注册static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0));}//包装public int Age{get { return (int)GetValue(AgeProperty); }set { SetValue(AgeProperty, value); }}}

 

4、依赖属性值改变回调  

  在PropertyMetadata当中当中传入一个回调函数

  public class Dp:Panel{//定义public static readonly DependencyProperty AgeProperty;//注册static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0,OnAgeChange));}/// <summary>/// 改变回调函数/// </summary>/// <param name="d">发出该改变的依赖对象</param>/// <param name="e">发生的事件</param>private static void OnAgeChange(DependencyObject d, DependencyPropertyChangedEventArgs e){//业务代码//e.NewValue//e.OldValue
}//包装public int Age{get { return (int)GetValue(AgeProperty); }set { SetValue(AgeProperty, value); }}}

 

5、依赖属性验证回调

  在DependencyProperty.Register注册方法当中传入回调函数

 public class Dp:Panel{//定义public static readonly DependencyProperty AgeProperty;//注册static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0,OnAgeChange),new ValidateValueCallback(OnAgeChangeValid));}private static bool OnAgeChangeValid(object value){//验证逻辑return true;}//包装public int Age{get { return (int)GetValue(AgeProperty); }set { SetValue(AgeProperty, value); }}}

 

6、依赖属性的强制回调

  在PropertyMetadata当中当中传入一个回调函数

  static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0,OnAgeChange,ForceCallBack),new ValidateValueCallback(OnAgeChangeValid));}

 

7、依赖属性继承  

   AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new FrameworkPropertyMetadata(0,FrameworkPropertyMetadataOptions.Inherits),     );
    public class Class1:Control{public int StuAge{get { return (int)GetValue(StuAgeProperty); }set { SetValue(StuAgeProperty, value); }}// Using a DependencyProperty as the backing store for StuAge.  This enables animation, styling, binding, etc...public static readonly DependencyProperty StuAgeProperty =DpTest.AgeProperty.AddOwner( typeof(Class1),new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.Inherits));}

 

8、附加属性

  使用propa快捷键可快速创建

   public class AttachTest{//包装public static int GetCustPwdProperty(DependencyObject obj){return (int)obj.GetValue(CustPwdProperty);}public static void SetCustPwdProperty(DependencyObject obj, int value){obj.SetValue(CustPwdProperty, value);}// 定义、注册public static readonly DependencyProperty CustPwdProperty =DependencyProperty.RegisterAttached("CustPwdProperty", typeof(string), typeof(AttachTest), new PropertyMetadata(""));}

 

 <PasswordBox local:AttachTest.CustPwdProperty="{Binding Pwd}" Width="60" Height="30"></PasswordBox>

 

将PasswordBox与附加属性之间建立联系:

  

 //附加属性public class AttachTest{//包装public static string GetCustPwdProperty(DependencyObject obj){return (string)obj.GetValue(CustPwdProperty);}public static void SetCustPwdProperty(DependencyObject obj, string value){obj.SetValue(CustPwdProperty, value);}// 定义、注册public static readonly DependencyProperty CustPwdProperty =DependencyProperty.RegisterAttached("CustPwdProperty", typeof(string), typeof(AttachTest), new PropertyMetadata("", OnCustPwdPropertyChanged));//当附加属性变化时将PasswordBox的Password修改为附加属性的值private static void OnCustPwdPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){string pwd = (string)e.NewValue;PasswordBox passwordBox = d as PasswordBox;//弱转换if (passwordBox != null){passwordBox.Password = pwd;}}//当PasswordBox的Password变化时将附加属性修改为Password的值public static bool GetOrderProperty(DependencyObject obj){return (bool)obj.GetValue(OrderProperty);}public static void SetGetOrderProperty(DependencyObject obj, bool value){obj.SetValue(OrderProperty, value);}// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...public static readonly DependencyProperty OrderProperty =DependencyProperty.RegisterAttached("OrderProperty", typeof(bool), typeof(AttachTest), new PropertyMetadata(true, OnOrderPropertyChanged));private static void OnOrderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){PasswordBox passwordBox = d as PasswordBox;if (passwordBox != null){passwordBox.PasswordChanged -= OnPasswordChanged;passwordBox.PasswordChanged += OnPasswordChanged;}}private static void OnPasswordChanged(object sender, RoutedEventArgs e){PasswordBox dp = sender as PasswordBox;SetCustPwdProperty(dp, dp.Password);}}

 

http://www.gsyq.cn/news/94560.html

相关文章:

  • ARM 架构中的数据内存屏障指令 DMB
  • TileLang终极指南:45分钟内打造你的首个高性能GPU算子
  • 窗口相关操作的总结
  • 北京陪诊服务权威推荐榜单 - 品牌排行榜单
  • 2026中专毕业想做出纳,考哪些证书企业比较认可?这些证让你轻松入职!
  • 峰值检测电路
  • 量子计算驱动的分布式云存储系统在数据安全与高效检索中的创新应用 - 教程
  • 从零到一:构建一个实时语音翻译应用(Vue3 + Web Speech API)
  • 基于PyTorch的深度学习基础课程之十:损失函数
  • Spark:革命性的命令行数据可视化工具,让DevOps监控更高效
  • 基于Java的安全生产智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的安全生产智经营理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的安全生产检查统计分析智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 3步打造Switch专属开机动画:让你的主机从启动就与众不同
  • 北京上门收画服务权威推荐榜单​ - 品牌排行榜单
  • 重练算法(代码随想录版) day39 - 动态规划part7
  • LLM - 从 Prompt 到上下文工程:面向 Java 的生产级 AI Agent 设计范式
  • AI元人文构想:元协议、行为重塑与文明免疫系统——通往意义原生的智能未来
  • 影刀RPA×AI强强联合!小红书笔记转化数据智能分析,3分钟洞察爆款密码![特殊字符]
  • test tags - itnews
  • 20251213 - 最小生成树
  • 2025年“免费+付费”降AI工具组合使用指南,ai率降到15%
  • 软件工程选择题
  • java流程控制
  • python中的“内置函数”
  • 终极指南:快速搭建Gitea自托管Git服务
  • 根据实际体验,优先选择支持多轮修改、学术规范严格的平台更省心。
  • Vue脚手架快速搭建指南
  • CSS 选择器
  • 祝贺C++40周年