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

      主站蜘蛛池模板: 精品无码一区二区三区电影| 精品国产免费一区二区| 国产精品一区视频| 亚洲国产精品成人一区| 少妇激情一区二区三区视频 | 一区二区三区无码被窝影院| 一级毛片完整版免费播放一区| 老熟妇仑乱一区二区视頻| 久久精品国产第一区二区| 国产精品视频一区| 精品无码一区二区三区爱欲九九| 精品人妻少妇一区二区三区在线| 国产成人精品一区二区三在线观看| 无码毛片视频一区二区本码 | 日韩免费一区二区三区在线 | 精品乱码一区内射人妻无码| 亚洲欧美日韩一区二区三区在线| 麻豆AV一区二区三区| 国产精品一区在线播放| 麻豆亚洲av熟女国产一区二| 无码人妻精品一区二区三18禁| 久久毛片免费看一区二区三区| 色一情一乱一伦一区二区三区日本 | 国产裸体歌舞一区二区| 久久精品人妻一区二区三区| 国产高清在线精品一区二区三区| 女人和拘做受全程看视频日本综合a一区二区视频| 中文字幕一区二区三匹| 无码人妻精品一区二区蜜桃网站| 亚洲一区二区三区免费观看| 99热门精品一区二区三区无码| 日本无卡码一区二区三区| 午夜性色一区二区三区免费不卡视频| 久久er99热精品一区二区| 亚洲一区二区三区乱码在线欧洲| 欧洲亚洲综合一区二区三区| 一区二区三区无码高清视频| 亚洲国产精品第一区二区三区| 91国在线啪精品一区| 国产AV一区二区三区无码野战 | 成人精品一区二区三区校园激情|