ITPub博客

首页 > 应用开发 > Html/css > 在看定义之前,先来看两段代码,一个是C#中普通属性的示例代码

在看定义之前,先来看两段代码,一个是C#中普通属性的示例代码

投稿 Html/css 作者:ecclw459 时间:2026-01-29 16:29:48 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-01-07

  • 博文量
    108
  • 访问量
    102104