依赖属性
2022/1/11 23:05:04
本文主要是介绍依赖属性,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一 、依赖属性
1、 依赖属性的意义与作用
数据绑定
2、定义依赖属性
基本:声明 注册 包装
//1 声明 public static DependencyProperty valueProperty; //2 注册 static DependenProperties() { valueProperty = DependencyProperty.Register("value", typeof(string), typeof(DependenProperties),new PropertyMetadata(default(string))); } //3 包装 public string value { get { return (string)this.GetValue(valueProperty); } set { this.SetValue(valueProperty, "小明"); } } 备注:在类中必须继承 DependencyObject
3、依赖属性回调方法与参数
ValidateValueCallback :属性值验证回调
//2 注册 static DependenProperties() { valueProperty = DependencyProperty.Register("value", typeof(string), typeof(DependenProperties),new PropertyMetadata(default(string),new PropertyChangedCallback (OnValueChangedCallback)),new ValidateValueCallback(OnValidateValueCallback)); } //回调方法必须是静态方法 //参数一:DependencyObject : 属性所在的对象 //参数二:DependencyPropertyChangedEventArgs : 变化动作所关联的数据 public static void OnValueChangedCallback(DependencyObject o,DependencyPropertyChangedEventArgs arg) { ...... } //验证回调函数 //参数一:Object :属性将要写入的值【最新值】 //返回值:bool 类型:是否允许写入 public static bool OnValidateValueCallback(Object o) { ...... return true; }
CoerceValueCallback:强制值回调 代码如下:
//2 注册 static DependenProperties() { valueProperty = DependencyProperty.Register("value", typeof(string), typeof(DependenProperties),new PropertyMetadata(default(string),new PropertyChangedCallback (OnValueChangedCallback),new CoerceValueCallback() ),new ValidateValueCallback(OnValidateValueCallback)); } //回调方法必须是静态方法 //参数一:DependencyObject : 属性所在的对象 //参数二:DependencyPropertyChangedEventArgs : 变化动作所关联的数据 public static void OnValueChangedCallback(DependencyObject o,DependencyPropertyChangedEventArgs arg) { ...... } //验证回调函数 //参数一:Object :属性将要写入的值【最新值】 //返回值:bool 类型:是否允许写入 public static bool OnValidateValueCallback(Object o) { ...... return true; } //强制回调函数 // <param name="d">属性对象</param> /// <param name="baseValue">当前属性的最新值</param> /// <returns>希望属性可以接收的值</returns> public static void OnCoerceValueCallback(DependencyObject d, object baseValue) { return null; }
PropertyChangedCallback:属性变化回调 代码如下:
//2 注册 static DependenProperties() { valueProperty = DependencyProperty.Register("value", typeof(string), typeof(DependenProperties),new PropertyMetadata(default(string),new PropertyChangedCallback (OnValueChangedCallback) )); } //回调方法必须是静态方法 //参数一:DependencyObject : 属性所在的对象 //参数二:DependencyPropertyChangedEventArgs : 变化动作所关联的数据 public static void OnValueChangedCallback(DependencyObject o,DependencyPropertyChangedEventArgs arg) { ...... }
注意:
属性注册: 【推荐】
//属性注册 static CallBack() { ValueProperty = DependencyProperty.Register( "Value", typeof(string), typeof(CallBack), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault| FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(OnValueChangesCallBack),new CoerceValueCallback (OnCoerceValueCallback)), new ValidateValueCallback(ValidateValueCallback) ); } //FrameworkPropertyMetadata 对象比PropertyMetadata多了几个参数: //其中的 FrameworkPropertyMetadataOptions. | FrameworkPropertyMetadataOptions. 选项参数,当值发生变化后他会重新渲染页面,重新显示最新值。 //FrameworkPropertyMetadataOptions选项: //AffectsArrange、AffectsMeasure、AffectsParentArrange、AffectsParentMeasure:属性变化的时候,需要通知容器进行重新测量和排列。Margin值变化的时候,就会把相邻的对象挤开 //AffectsRender:属性值的变化导致元素重新渲染、重新绘制 //BindsTwoWayByDefault:默认情况以双向绑定的方式处理绑定行为 //Inherits:继承。FontSize,父对象进行这个属性设置的时候,会对子对象进行相同的影响 //IsAnimationProhibited:这个属性不能用于动画 //IsNotDataBindable:不能使用表达式,设置依赖属性 //Journal:Page开发,属性的值会被保存到 日志 //SubPropertiesDoNotAffectRender:对象属性子属性变化时,不去重新渲染对象 //DefaultValue:默认值
输入属性值----->触发验证回调------>【验证通过】----->写入到属性值------>【值发生变化后】------>触发属性变化回调 -----> 强制回调。
4、依赖附加属性
1、依赖附加属性的意义与作用
给其他对象提供依赖属性。
比如有的属性不能绑定。【password】
2、 定义依赖属性 【新建 Controller类:】
基本:
声明
public static DependencyProperty PasswordValueProperty;
注册
public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached("PasswordValue", typeof(string), typeof(Controller), new PropertyMetadata(default(string), new PropertyChangedCallback(OnPropertyChangedCallback) ) );
包装
public static string GetPasswordValue(DependencyObject obj) { return (string)obj.GetValue(MyPropertyProperty); } public static void SetPasswordValue(DependencyObject obj, string value) { obj.SetValue(MyPropertyProperty, value); }
值发生变化后触发的回调函数
public static void OnPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { (d as PasswordBox).Password = (string)e.NewValue; }
xmal代码如下:
<Window x:Class="WpfApp1.DependenProperties.DependenProperties" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1.DependenProperties" xmlns:sys="clr-namespace:System;assembly=System.Runtime" mc:Ignorable="d" Title="DependenProperties" Height="450" Width="800"> <Window.Resources> <sys:String x:Key="pwd">123</sys:String> </Window.Resources> <Grid> <PasswordBox Password="" local:Controller.PasswordValue="{Binding Source={StaticResource pwd}}"></PasswordBox> </Grid> </Window>
3、主要回调
回调和依赖属性一样使用。
4、 属性元数据参数
同依赖属性一样。
5、 使用场景
6、与依赖属性的区别总结
依赖属性:必须在依赖对象里,附加属性不一定。
5、类型转换器
新建依赖属性类: 【Control】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace WpfApp1.TypeConverterDemo { [TypeConverter(typeof(TypeConvertDemo))] public class Control { public double Width { get; set; } public double Height { get; set; } } public class ControlProperty:ContentControl { public Control Value { get { return (Control)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Control), typeof(ControlProperty), new PropertyMetadata(null)); } }
新建数据类型转换类:【TypeConvertDemo】继承 TypeConverter
using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WpfApp1.TypeConverterDemo { public class TypeConvertDemo : TypeConverter { /// <summary> ///类型转换 /// </summary> /// <param name="context">上下文</param> /// <param name="culture">当前本地化信息</param> /// <param name="value">传递值</param> /// <returns></returns> public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { var temp = Convert.ToString(value).Split(','); var c = new Control() { Width = Convert.ToDouble(temp[0]), Height = Convert.ToDouble(temp[1]) }; return c; } } }
新建xaml:【Window1.xaml】
<Window x:Class="WpfApp1.TypeConverterDemo.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1.TypeConverterDemo" mc:Ignorable="d" Title="Window1" Height="450" Width="800"> <Grid> <local:ControlProperty Value="12,34" x:Name="cc"></local:ControlProperty> <Button Content="提交" Click="Button_Click"></Button> </Grid> </Window>
Window1.xaml.cs Button触发的事件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace WpfApp1.TypeConverterDemo { /// <summary> /// Window1.xaml 的交互逻辑 /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { _ = this.cc.Value; } } }
这篇关于依赖属性的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-01一个基于注解驱动的可视化的DDD架构-超越COLA的设计
- 2025-01-01PlantUML 时序图 基本例子
- 2025-01-01plantuml 信号时序图
- 2025-01-01聊聊springboot项目如何优雅进行数据校验
- 2024-12-31自由职业者效率提升指南:3个时间管理技巧搞定多个项目
- 2024-12-31适用于咨询行业的项目管理工具:提升跨团队协作和工作效率的最佳选择
- 2024-12-31高效协作的未来:2024年实时文档工具深度解析
- 2024-12-31商务谈判者的利器!哪 6 款办公软件能提升春节合作成功率?
- 2024-12-31小团队如何选择最实用的项目管理工具?高效协作与任务追踪指南
- 2024-12-31数据赋能,智慧养老:看板软件如何重塑养老服务生态