From c870e8a342bea270db60bd82b61d95d4e27ad082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=9E=E8=89=B2=20=E5=BC=80?= <1694439208@qq.com> Date: Tue, 28 Nov 2023 16:53:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E5=A4=9A=E7=BA=A7=E4=BB=BB=E6=84=8F=E7=BB=91=E5=AE=9A=EF=BC=8C?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E9=BB=98=E8=AE=A4=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CPF/Binding.cs | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/CPF/Binding.cs b/CPF/Binding.cs index 18de00e..b529cf2 100644 --- a/CPF/Binding.cs +++ b/CPF/Binding.cs @@ -591,15 +591,6 @@ namespace CPF var Temp_Target = Target.GetPropretyValue(SourcePropertyNames[i]) as CpfObject; if (Temp_Target == null) { - //如果链式绑定的子级为null,那么监听他的父级监听子级 - this.SourcePropertyIndex = i; - if (SourceProperty!=null) - { - SourceProperty.PropertyChanged -= Target_PropertyChanged; - CancellationPropertyChanged(SourceProperty); - } - (Target as CpfObject).PropertyChanged += Target_PropertyChanged; - SourceProperty = (Target as CpfObject); return null; } Target = Temp_Target; @@ -608,19 +599,23 @@ namespace CPF } catch (Exception ex) { - throw new Exception("错误:{ex}"); + throw new Exception($"错误:{ex}"); } } CpfObject SourceProperty = null; - private void Target_PropertyChanged(object sender, CPFPropertyChangedEventArgs e) + private void Target_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.NewValue == null) + //重新绑定 + if (BindingMode == BindingMode.TwoWay || + BindingMode == BindingMode.OneWay || + BindingMode == BindingMode.OneTime) { - CancellationPropertyChanged(sender as CpfObject); - return; + var SourcePropertyNames = SourcePropertyName.Split('.'); + var Temp_Target = GetPropertySource(SourcePropertyName, Source.Target); + var data = (Temp_Target as CpfObject)?.GetValue(SourcePropertyNames.LastOrDefault()); + Owner.SetPropretyValue(TargetPropertyName, data); } - - RegisterPropertyChanged(sender as CpfObject); + RegisterPropertyChanged(sender as INotifyPropertyChanged); } internal void RegisterPropertyChanged(INotifyPropertyChanged notify) @@ -629,13 +624,25 @@ namespace CPF //{ // throw new Exception("错误"); //} - var Temp_SourcePropertyName = string.Join(".", this.SourcePropertyName.Split('.').Skip(this.SourcePropertyIndex)); - var notifySource = GetPropertySource(Temp_SourcePropertyName, notify); - if (notifySource == null) + var SourcePropertyNames = SourcePropertyName.Split('.'); + if (SourcePropertyNames.Length == 1) { + RegisterPropertyChanged(notify, PropertyChanged); return; } - RegisterPropertyChanged(notifySource as INotifyPropertyChanged, PropertyChanged); + var Target = Source.Target; + RegisterPropertyChanged(Target as CpfObject, Target_PropertyChanged); + for (int i = 0; i < SourcePropertyNames.Length - 1; i++) + { + var Temp_Target = Target.GetPropretyValue(SourcePropertyNames[i]) as CpfObject; + if (Temp_Target == null) + { + return; + } + RegisterPropertyChanged(Temp_Target, Target_PropertyChanged); + Target = Temp_Target; + } + RegisterPropertyChanged(Target as INotifyPropertyChanged, PropertyChanged); } internal void CancellationPropertyChanged(INotifyPropertyChanged notify) {