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

    60acb4e0ef112.png
    主站蜘蛛池模板: 国产午夜精品一区二区三区极品| 一区二区不卡久久精品| 亚洲日本一区二区| 国语精品一区二区三区| 精品视频一区二区| 一区二区三区中文字幕| 久久99国产一区二区三区| 夜色阁亚洲一区二区三区| 国产日韩精品一区二区在线观看播放| 日韩福利视频一区| 色噜噜一区二区三区| 一区二区三区免费视频播放器| 日韩人妻精品一区二区三区视频 | 亚洲一区二区三区首页| 亚洲国产精品一区二区成人片国内 | 亚洲色婷婷一区二区三区| 久久久久久免费一区二区三区| 午夜天堂一区人妻| 偷拍激情视频一区二区三区| 中文字幕一区日韩精品| 国产精品区一区二区三| 福利一区福利二区| 美女一区二区三区| 无码播放一区二区三区| 秋霞鲁丝片一区二区三区| 国产成人综合精品一区| 农村乱人伦一区二区| 无码人妻精品一区二区三区不卡| 免费人妻精品一区二区三区| 中文字幕一区二区三区日韩精品| 少妇特黄A一区二区三区| 亚洲AV噜噜一区二区三区| 天码av无码一区二区三区四区| 亚洲线精品一区二区三区影音先锋 | 国产suv精品一区二区6| 农村人乱弄一区二区| 国产自产对白一区| 亚洲一区二区精品视频| 精品深夜AV无码一区二区| 精品成人一区二区三区免费视频| 不卡无码人妻一区三区音频|