C# 实现属性监听 属性绑定

3 篇文章 0 订阅

PropertyBinding

namespace PropertyBinding
{
    using System;

    public class PropertyBinding 
    {
        /// <summary>
        /// 属性名称
        /// </summary>
        public string PropertyName { get; private set; }

        /// <summary>
        /// 属性更改事件
        /// </summary>
        private Action<object> OnChangeEvent;

        /// <summary>
        /// 获得属性值
        /// </summary>
        private Func<object> OnGetValue;

        public PropertyBinding(string bindName, Func<object> onGetValue) : this(bindName, onGetValue, true)
        {

        }
        public PropertyBinding(string bindName, Func<object> onGetValue, bool addBinding = true)
        {
            PropertyName = bindName;
            OnGetValue = onGetValue;
            OnChangeEvent = null;

            if (addBinding)
                PropertyBindingMa.AddBinding(this);
        }

        public virtual void AddListener(Action<object> onChangeEvent)
        {
            this.OnChangeEvent += onChangeEvent;
            onChangeEvent?.Invoke(GetValue());
        }

        public virtual void RemoveListener(Action<object> onChangeEvent)
        {
            if (null != this.OnChangeEvent)
                this.OnChangeEvent -= onChangeEvent;
        }

        /// <summary>
        /// 获得属性值
        /// </summary>
        /// <returns></returns>
        public virtual object GetValue()
        {
            if (null == OnGetValue)
                return default(object);

            return OnGetValue();
        }

        /// <summary>
        /// 通知属性更改
        /// </summary>
        public virtual void NotfiyValueChange()
        {
            this.OnChangeEvent?.Invoke(GetValue());
        }
    }

    public class PropertyBindingType<T> : PropertyBinding
    {
        public delegate void PropertyChangeDelegate(T value);

        /// <summary>
        /// 属性更改事件
        /// </summary>
        private PropertyChangeDelegate OnChangeEvent;
        /// <summary>
        /// 获得属性值
        /// </summary>
        private Func<object, T> OnGetValue;

        private object Data;

        public PropertyBindingType(string bindName, Func<object, T> onGetValue, object data = null) : base(bindName, null, false)
        {
            OnGetValue = onGetValue;
            Data = data;
            PropertyBindingMa.AddBinding(this);
        }

        /// <summary>
        /// 注册通知消息
        /// 
        /// 注册时会主动通知一次
        /// </summary>
        /// <param name="onChangeEvent"></param>
        public void AddListenerT(PropertyChangeDelegate onChangeEvent)
        {
            this.OnChangeEvent += onChangeEvent;
            onChangeEvent?.Invoke(GetValueT());
        }

        public void RemoveListenerT(PropertyChangeDelegate onChangeEvent)
        {
            if (null != this.OnChangeEvent)
                this.OnChangeEvent -= onChangeEvent;
        }

        public override object GetValue()
        {
            return GetValueT();
        }
        public T GetValueT()
        {
            if (null == OnGetValue)
                return default(T);

            return OnGetValue(Data);
        }

        /// <summary>
        /// 通知属性更改
        /// </summary>
        public override void NotfiyValueChange()
        {
            this.OnChangeEvent?.Invoke(GetValueT());
        }

        /// <summary>
        /// 注册通知消息
        /// 
        /// 注册时会主动通知一次
        /// </summary>
        /// <param name="name"></param>
        /// <param name="onChangeEvent"></param>
        public static void AddListenerT(string name, PropertyChangeDelegate onChangeEvent)
        {
            var property = PropertyBindingMa.GetBinding<T>(name);
            if (property == null)
            {
                throw new Exception($"{name}  属性不存在");
            }
            else
            {
                property.AddListenerT(onChangeEvent);
            }
        }
    }

}

PropertyBindingMa

using System;
using System.Collections.Generic;

namespace PropertyBinding
{
    /// <summary>
    /// 属性绑定 管理器
    ///
    /// </summary>
    public class PropertyBindingMa
    {

        private static Dictionary<string, PropertyBinding> propertyMap = new Dictionary<string, PropertyBinding>();

        /// <summary>
        /// 添加绑定
        /// </summary>
        public static void AddBinding(PropertyBinding binding)
        {
            if (propertyMap.ContainsKey(binding.PropertyName))
            {
                throw new Exception("绑定属性已存在");                
            }
            else
            {
                propertyMap.Add(binding.PropertyName, binding);
            }
        }

        /// <summary>
        /// 移除属性绑定
        /// </summary>
        /// <param name="key"></param>
        public static void RemoveBinding(string key)
        {
            propertyMap.Remove(key);
        }

        /// <summary>
        /// 获得绑定的属性
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>

        public static PropertyBinding GetBinding(string key)
        {
            propertyMap.TryGetValue(key, out var value);
            return value;
        }


        /// <summary>
        /// 获得绑定的属性
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>

        public static PropertyBindingType<T> GetBinding<T>(string key)
        {
            if (propertyMap.TryGetValue(key, out var value))
            {
                return (PropertyBindingType<T>)value;
            }

            return null;
        }

        public static void Notfiy(string key)
        {
            if (propertyMap.TryGetValue(key, out var value))
                value.NotfiyValueChange();
        }
    }

}

测试程序

using System;

namespace PropertyBinding
{

    class SourceData
    {
        private int bingNum;

        public int BingNum { get => bingNum; set {

                bingNum = value;
                PropertyBindingMa.Notfiy(nameof(bingNum));
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var sourceData = new SourceData();
            var propertyName = "bingNum";

            new PropertyBindingType<int>(propertyName, (data) => ((SourceData)data).BingNum, sourceData);
            PropertyBindingMa.GetBinding<int>(propertyName).AddListenerT(OnBindNumListener);


            Console.WriteLine("更改属性值为 10");
            sourceData.BingNum = 10;


            Console.ReadLine();
        }

        private static void OnBindNumListener(int value)
        {
            Console.WriteLine($"属性监听成功:{value}");
        }
    }
}

属性监听成功:0
更改属性值为 10
属性监听成功:10

原文地址 C# 属性值监听管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值