WPF 依赖属性

 

    <Grid>
        <local:property Tag="123"/>
        <local:property Tag="456" value="200"/>
    </Grid>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace Property.zhaoxi
{
    class property :Control
    {
        //普通属性
        public int id { get; set; } = 12;

        private string _name;
        public string name
        {
            get { return _name; }
            set { _name = value; }
        }

        //依赖属性 所在对象 必须是依赖对象
        //声明搞定
        //readonly 只能被赋值一次,不能二次修改
        public static readonly DependencyProperty ValueProperty;

        //注册依赖属性
        static property()
        {
            //基本类型:属性名称 属性类型 所属类型
            //默认值要跟属性类型严格一致

            //委托回调方法参数
            ValueProperty = DependencyProperty.Register(
                "value", 
                typeof(double), 
                typeof(property),
                new PropertyMetadata(0.0 , 
                new PropertyChangedCallback(OnValueChanged),
                //强制回调
                new CoerceValueCallback(OnCoerceValue)),
                //值验证回调
                new ValidateValueCallback(OnValidateValue)
                  
                );
        }
        //属性值变化回调,处理的是属性值的变化
        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            //如果调用成功,这里将知道对应的依赖属性值发生了变化
            //d:属性所在对象
            //e:属性变化前后的值
            //e.NewValue
            //e.OldValue
            //这是通过实例访问
            (d as property).Refresh();
        }
        //值验证调用
        private static bool OnValidateValue(object v)
        {
            // 验证属性值是否合法
            // 返回 true 表示合法
            // 返回 false 表示不合法
            if ((double)v > 2000)
            {
                return false;
            }
            return true;
        }
        //强制回调
        private static object OnCoerceValue(DependencyObject d, object baseValue)
        {
            //强制回调,可以对属性值进行强制处理
            //返回值就是最终的属性值
            if ((double)baseValue > 2000)
            {
                return 2000.0;
            }
            return baseValue;
        }


        private void Refresh()
        {
            //刷新界面
        }

        public double value
        {
            get { return (double)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        public property()
        {
            this.id=0;

            var v = this.GetValue(ValueProperty);

            this.Loaded += (se, ev) =>
            {
                this.SetValue(ValueProperty, 11.0);

                this.value = 11.0;
                this.value = 11.0;
                this.SetValue(ValueProperty, 11.0);
            };
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值