完善主體資料,免費贈送VIP會員!
    * 主體類型
    * 企業名稱
    * 信用代碼
    * 所在行業
    * 企業規模
    * 所在職位
    * 姓名
    * 所在行業
    * 學歷
    * 工作性質
    請先選擇行業
    您還可以選擇以下福利:
    行業福利,領完即止!

    下載app免費領取會員

    NULL

    ad.jpg

    二次開發教程:研究下WPF 數據binding 原理

    發布于:2019-07-24 16:38:12

    網友投稿

    更多

    測試相關類


        public class HostTest 

        {

            public string Value{get; set;}

     

            public string Value1 {get ;set ;}

        }

        public class Test 

        {

            private string _value = null;

            public string Value

            {

                get { return _value; }

                set

                {

                    _value = value;                

                }

            }

     

            private string _value1 = null;

            public string Value1

            {

                get { return _value1; }

                set

                {

                    _value1 = value;               

                }

            }

        }

    實現效果是將一個HostTest 對象的兩個屬性綁定到Test的兩個屬性上,然后實現HostTest對應的屬性改變,兩個Test 對象的屬性也自動修改,反之亦然,實現代碼如下:


    namespace BindingDemo

    {

        class Program

        {

            static void Main(string[] args)

            {

                var host = new HostTest();

                var test = new Test();

                var test1 = new Test();

                

                host.AddBinding("Value", new Binding(test, "Value"));

                host.AddBinding("Value1", new Binding(test, "Value1"));

     

                host.AddBinding("Value", new Binding(test1, "Value"));

                host.AddBinding("Value1", new Binding(test1, "Value1"));

     

                host.Value = "Test1";

                host.Value1 = "Test1";

     

                Console.WriteLine(test.Value);//Test1

                Console.WriteLine(test.Value1);//Test1

     

                Console.WriteLine(test1.Value);//Test1

                Console.WriteLine(test1.Value1);//Test1

     

                test.Value = "Test2";

                test.Value1 = "Test2";

                Console.WriteLine(host.Value);//Test2

                Console.WriteLine(host.Value1);//Test2

                Console.WriteLine(test1.Value);//Test2

                Console.WriteLine(test1.Value1);//Test2

                Console.ReadLine();

            }

        }

     

        public delegate void OnPropertyChanged(object obj,string name);

     

        public interface INotifier

        {

            OnPropertyChanged OnPropertyChanged { get; set; }

        }

     

        public class Binding

        {

            public object Host { get; set; }

            public string HostProperty { get; set; }

            public object Target { get; set; }

            public string Property { get; set; }

     

            public Binding(object target, string property)

            {

                Target = target;

                Property = property;

            }

     

            internal void UpdateTargetValue(object value)

            {

                var property = Target.GetType().GetProperty(Property);

                property.SetValue(Target, value);

            }

     

            internal void UpdateHostValue()

            {

                var property = Target.GetType().GetProperty(Property);

                object value = property.GetValue(Target);

                property = Host.GetType().GetProperty(HostProperty);

                property.SetValue(Host, value);

            }

        }

     

        public abstract class BindingHostBase

        {

            private Dictionary<string, object> _values = new Dictionary<string, object>();

            private List<Binding> _bindings = new List<Binding>();

            private Dictionary<string, List<Binding>> _bindDict = new Dictionary<string, List<Binding>>();

     

            public void AddBinding(string propertyName, Binding binding)

            {

                if (!_bindDict.ContainsKey(propertyName))

                {

                    _bindDict.Add(propertyName, new List<Binding>() {});

                }

     

                var bindings = _bindDict[propertyName];

                if (bindings.Contains(binding))

                {

                    return;

                }

     

                bindings.Add(binding);

                _bindings.Add(binding);

     

                binding.Host = this;

                binding.HostProperty = propertyName;

                var notifier = binding.Target as INotifier;

                if (notifier.OnPropertyChanged == null)

                {

                    notifier.OnPropertyChanged = (obj, name) =>

                    {

                        var bds = _bindings.Where(b => b.Target == obj && b.Property == name).ToList();

                        if (bds != null)

                            bds.ForEach(b => b.UpdateHostValue());

                    };

                }

     

            }

     

            public void SetValue(string name, object value)

            {

                if (_values.ContainsKey(name))

                {

                    bool flag = _values[name] != value;

                    _values[name] = value;

                    if(flag)

                    _bindDict[name].ForEach(b=>b.UpdateTargetValue(value));

                }

                else

                {

                    _values.Add(name, value);

                    _bindDict[name].ForEach(b => b.UpdateTargetValue(value));

                }

            }

     

            public object GetValue(string name)

            {

                if (_values.ContainsKey(name))

                {

                    return _values[name];

                }

                return null;

            }

        }

     

        public class HostTest : BindingHostBase

        {

            public string Value

            {

                get { return (string) GetValue(nameof(Value)); }

                set { SetValue(nameof(Value), value); }

            }

     

            public string Value1

            {

                get { return (string)GetValue(nameof(Value1)); }

                set { SetValue(nameof(Value1), value); }

            }

        }

     

        public class Test : INotifier

        {

            private string _value = null;

     

            public string Value

            {

                get { return _value; }

                set

                {

                    _value = value;

                    RaisePropertyChanged(nameof(Value));

                }

            }

     

            private string _value1 = null;

     

            public string Value1

            {

                get { return _value1; }

                set

                {

                    _value1 = value;

                    RaisePropertyChanged(nameof(Value1));

                }

            }

     

            public OnPropertyChanged OnPropertyChanged { get ; set ; }

     

            public void RaisePropertyChanged(string name)

            {

                OnPropertyChanged?.Invoke(this, name);

            }

        }

     

    }

    本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

    未標題-1.jpg

    上一篇:二次開發教程:Hello Emit

    下一篇:二次開發教程:MyBatis增刪查改

    主站蜘蛛池模板: 一区二区三区在线播放| 亚洲视频一区在线播放| 麻豆国产一区二区在线观看| 国产萌白酱在线一区二区| 日本精品一区二区三区在线视频| 国产福利精品一区二区| 国产精品无码不卡一区二区三区| 亚洲一区二区三区高清| 精品aⅴ一区二区三区| 日本夜爽爽一区二区三区| 最新中文字幕一区二区乱码| 免费日本一区二区| 人妻无码一区二区三区四区| 无码播放一区二区三区| 麻豆AV无码精品一区二区| 麻豆aⅴ精品无码一区二区| 久久精品一区二区三区资源网| 国产精品一区12p| 一区二区不卡久久精品| 无码人妻精品一区二区蜜桃AV| 精品国产一区在线观看 | 国产一区二区三区播放| 无码av免费毛片一区二区 | 国产成人久久一区二区三区| 亚洲一区电影在线观看| 亚洲欧洲日韩国产一区二区三区 | 在线不卡一区二区三区日韩| 国产精品第一区揄拍| 精品无码综合一区二区三区 | 中文字幕一区二区三区人妻少妇| 日韩精品一区二区三区老鸭窝| 亚洲天堂一区在线| 伊人久久精品一区二区三区| 亚洲一区二区三区在线观看蜜桃 | 亚洲国产系列一区二区三区| 国产高清在线精品一区| 亲子乱av一区区三区40岁| 日韩精品一区二区三区不卡 | 少妇人妻偷人精品一区二区| 国产激情无码一区二区| 呦系列视频一区二区三区|