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

    主站蜘蛛池模板: tom影院亚洲国产一区二区 | 日本大香伊一区二区三区| 无码国产精品久久一区免费| 日韩一区二区电影| 国产一区二区三区美女| 国产成人亚洲综合一区| 亚洲AV综合色一区二区三区 | 精品国产天堂综合一区在线| 岛国无码av不卡一区二区| 国产精品久久无码一区二区三区网| 亚洲视频免费一区| 亚洲国产欧美日韩精品一区二区三区 | 国产免费一区二区三区免费视频| 国产精品视频一区二区噜噜| 国产亚洲福利精品一区二区| 精品国产一区AV天美传媒| 人妻AV中文字幕一区二区三区| 国产精品高清一区二区三区不卡| 久久亚洲日韩精品一区二区三区 | 国产日本一区二区三区| 美日韩一区二区三区| 学生妹亚洲一区二区| 不卡无码人妻一区三区音频| 亚洲一区二区三区乱码在线欧洲| 日本韩国黄色一区二区三区| 亚洲人成人一区二区三区| 成人一区二区免费视频| 日韩福利视频一区| 精品人妻中文av一区二区三区| 天堂va视频一区二区| 中文字幕精品无码一区二区三区| 日韩精品无码免费一区二区三区| 久久久久人妻精品一区三寸| 日产一区日产2区| 一区二区中文字幕在线观看| 海角国精产品一区一区三区糖心| 2014AV天堂无码一区| 色一乱一伦一区一直爽| 免费无码VA一区二区三区| 国产免费伦精品一区二区三区| 国产精品一区二区电影|