完善主體資料,免費贈送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增刪查改

    主站蜘蛛池模板: 国产一区二区在线观看视频| 亚洲一区二区三区91| 亚洲AV一区二区三区四区| 国产亚洲福利精品一区二区 | 国产精品无码一区二区三级| 亚洲AV无码一区二区三区牲色| 在线观看国产区亚洲一区成人 | 精品人妻无码一区二区三区蜜桃一| 99精品高清视频一区二区| 无码精品久久一区二区三区| 无码人妻精品一区二区三区99性 | 夜精品a一区二区三区| 亚洲一区二区三区无码国产| 免费无码一区二区三区| 久久精品一区二区三区资源网 | 97一区二区三区四区久久| 亚洲bt加勒比一区二区| 亚洲国产综合精品中文第一区| 亚洲一区二区三区AV无码| 日本一区午夜艳熟免费| 国精产品一区一区三区免费视频| 国产在线精品一区二区夜色| 国产免费一区二区三区免费视频 | 国产综合无码一区二区辣椒 | 理论亚洲区美一区二区三区| 亚洲国产AV无码一区二区三区| 亚洲国产成人久久一区二区三区| 国产精品高清视亚洲一区二区| 中文字幕在线不卡一区二区| 日韩精品人妻一区二区三区四区| 怡红院AV一区二区三区| 国产在线观看一区二区三区四区 | 国产亚洲无线码一区二区| 国精产品一区一区三区免费视频| 成人免费区一区二区三区| 国产激情一区二区三区 | 国精品无码A区一区二区| 国产综合无码一区二区辣椒| 亚洲日本va午夜中文字幕一区| 中文字幕AV一区二区三区人妻少妇| 亚洲日本va一区二区三区|