public string Name { set => name = value; get => name; } /* ================================================================================= */ // WPF -> 依赖属性 // 输入propdp,然后连续按两下Tab键,VS会帮我们自动生成下面的这段代码 public int MyProperty { get { return ( int )GetValue(MyPropertyProperty); } set { SetValue(MyPropertyProperty, value); } } // Using a DependencyProperty as the backing store for MyProperty. // This enables animation, styling, binding, etc... public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( "MyProperty" , typeof( int ), typeof(ownerclass),
{ // 并且使用了GetValue 和 SetValue成员 读/写 依赖属性 MyPropertyProperty // GetValue和SetValue -> 由DependencyObject类定义的 // GetValue -> 获取依赖属性值 // SetValue -> 写入依赖属性值 get { return ( int )GetValue(MyPropertyProperty); } set { SetValue(MyPropertyProperty, value); } } // Using a DependencyProperty as the backing store for MyProperty. // This enables animation, styling, binding, etc... // 翻译一下官方的这两句话: // 使用依赖属性作为 MyProperty 的存储方式 // 再翻译一下:MyProperty 的真实存储位置是一个 DependencyProperty,而不是字段 // 从而启用动画、样式、数据绑定等功能 /* 注册int类型的依赖属性 MyProperty */ // 被声明为 DependencyProperty 类型的静态只读类型的 MyPropertyProperty 成员 // 使用 DependencyProperty 的Register方法注册 public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( "MyProperty" , // 属性名,必须与上面的包装属性名称一致
// 依赖属性(读取和写入) -> 具备自动通知界面的能力 public string MyPasswordVM { get { return ( string )GetValue(MyPasswordVMProperty); } set { SetValue(MyPasswordVMProperty, value); } } // 注册string类型的依赖属性 MyPasswordVM public static readonly DependencyProperty MyPasswordVMProperty = DependencyProperty.Register( "MyPasswordVM" , // 属性名,必须与上面的包装属性名称一致
/* 1.定义 */ public static readonly DependencyProperty MyPasswordVMProperty = /* 2.注册 */ DependencyProperty.Register( "MyPasswordVM" , // 属性名,必须与上面的包装属性名称一致 typeof( string ), // 属性类型 typeof(MainWindow)); // 所属类型 /* 3.包装 */ public string MyPasswordVM { get { return ( string )GetValue(MyPasswordVMProperty); }
public class PropertyMetadata{ public PropertyMetadata () ; public PropertyMetadata (object defaultValue) ; public PropertyMetadata (PropertyChangedCallback propertyChangedCallback) ; public PropertyMetadata (object defaultValue, PropertyChangedCallback propertyChangedCallback) ; public PropertyMetadata (object defaultValue, wap.cerobj.com PropertyChangedCallback propertyChangedCallback, CoerceValueCallback coerceValueCallback) ; public object DefaultValue { get; set ; } public PropertyChangedCallback PropertyChangedCallback { get; set ; } public CoerceValueCallback CoerceValueCallback { get; set ; } protected bool IsSealed { get; } protected virtual void Merge (PropertyMetadata baseMetadata, DependencyProperty dp) ; protected virtual void OnApply (DependencyProperty dp, Type targetType) ; } // 注释版 public class PropertyMetadata{ // ================= 构造函数 ================= // 默认构造函数 -> 无默认值和回调 public PropertyMetadata () ; // 指定 属性的默认值 -> 当没有本地值、绑定值或样式时,依赖属性会使用这个默认值 public PropertyMetadata (object defaultValue) ; guan.fjhsws.cn // 指定 改变回调 -> 当属性值真正发生变化时触发,用于通知或更新 UI public PropertyMetadata (PropertyChangedCallback propertyChangedCallback) ; // 指定 默认值和 改变回调 public PropertyMetadata (object defaultValue, PropertyChangedCallback propertyChangedCallback) ; // 指定 默认值、属性改变回调和强制值回调 wap.abouta.cn // 强制回调 -> 用于在值写入之前动态调整或修正属性值 public PropertyMetadata (object defaultValue, PropertyChangedCallback propertyChangedCallback,wap.fjhsws.cn CoerceValueCallback coerceValueCallback) ; // ================= 属性 ================= // 属性的默认值 -> 当没有本地值、绑定值或样式提供值时使用 public object DefaultValue { get; set ; } // 改变回调 -> 属性值真正变更后触发 // 用于执行副作用,如刷新 UI 或同步其他属性 public PropertyChangedCallback PropertyChangedCallback { get; set ; } // 强制回调 -> 在值写入属性系统之前调用 // 可以根据对象状态调整值,确保属性值的一致性或约束 public CoerceValueCallback CoerceValueCallback { get; set ; } // 元数据是否已经被注册到 DependencyProperty 上 // 一旦注册,元数据不可修改,保证属性系统稳定 wap.mzdbt.com protected bool IsSealed { get; } // ================= 保护方法 ================= // 当依赖属性继承元数据(子类依赖属性覆盖父类依赖属性)时调用 // 用于合并父类元数据和当前元数据 protected virtual void Merge (PropertyMetadata baseMetadata, DependencyProperty dp) ; // 当元数据应用到某个依赖属性上时调用 // 框架内部使用,一般开发者不需要调用 wap.0527999.com
// 测试强制回调 -> 会,没事干记得注释掉 //Test = "123456789012345678901234567890"; // 测试改变回调 -> 你敢变我就敢() Test = "11" ; wap.shLnmp.com Test = "22" ; } public string Test {m.mzdbt.com get { return ( string )GetValue(TestProperty); } set { SetValue(TestProperty, value); } } public static readonly DependencyProperty TestProperty = DependencyProperty.Register( "Test" , // 属性名,必须与上面的 CLR 包装属性一致 typeof( string ), m.fjhsws.cn // 属性类型 typeof(MainWindow), // 所属类型 new PropertyMetadata( mp4.fjhsws.cn "1" , // 默认值 OnTestChanged, // 改变回调 CoerceTest wap.juanyitang.com // 强制回调 ),m.cerobj.com ValidateTest app.fjhsws.cn // 验证回调 ); // ==================== 三种回调 ==================== // 1️.验证回调 -> 在值进入属性系统之前进行合法性检查 private static bool ValidateTest (object value) { // 禁止写入空值 string s = value as string ; return ! string .IsNullOrEmpty(s); } // 2️.改变回调 -> 属性值真正生效后触发,用于通知或执行副作用 private static void OnTestChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) {m.abouta.cn MainWindow owner = d as MainWindow; string oldValue = ( string )e.OldValue; string newValue = ( string )e.NewValue;m.0527999.com Console.WriteLine($ "Test 变化:{oldValue} -> {newValue}" ); m.szdLg.com private static object CoerceTest (DependencyObject d, object baseValue) { m.shLnmp.com string s = baseValue as string ; if (s != null && s.Length > 20 ) {
ing System.Linq; nek.fjhsws.cn using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace Test { public class MyControl : Control { static MyControl () { // 指定默认样式,如果有自定义样式可以用这个 DefaultStyleKeyProperty.OverrideMetadata( typeof(MyControl),m.juanyitang.com new FrameworkPropertyMetadata(typeof(MyControl))); } public static readonly DependencyProperty MyTitleProperty = DependencyProperty.Register( www.mzdbt.com "MyTitle" , // 属性名 typeof( string ), // 属性类型 typeof(MyControl), guan.fjhsws.cn // 所属类 new PropertyMetadata( // 元数据 "默认标题" , wap.szdLg.com // 默认值 new PropertyChangedCallback(OnMyTitleChanged)) // 改变回调 ); public string MyTitle { get => ( string )GetValue(MyTitleProperty); set => SetValue(MyTitleProperty, value); } // 改变回调 private static void OnMyTitleChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as MyControl; // 当属性变化时打印新值 System.Diagnostics.Debug.WriteLine($ "MyTitle 改变为:{e.NewValue}" ); // 更新主窗口标题 if (control != null) { // 找到依赖属性所在的窗口 var window = Window.GetWindow(control); if (window != null) {
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3109426/ ,如需转载,请注明出处,否则将追究法律责任。