This commit is contained in:
小红帽 2023-11-28 16:56:02 +08:00
commit 4862d41d13

View File

@ -591,15 +591,6 @@ namespace CPF
var Temp_Target = Target.GetPropretyValue(SourcePropertyNames[i]) as CpfObject; var Temp_Target = Target.GetPropretyValue(SourcePropertyNames[i]) as CpfObject;
if (Temp_Target == null) 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; return null;
} }
Target = Temp_Target; Target = Temp_Target;
@ -608,19 +599,23 @@ namespace CPF
} }
catch (Exception ex) catch (Exception ex)
{ {
throw new Exception("错误:{ex}"); throw new Exception($"错误:{ex}");
} }
} }
CpfObject SourceProperty = null; 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); var SourcePropertyNames = SourcePropertyName.Split('.');
return; var Temp_Target = GetPropertySource(SourcePropertyName, Source.Target);
var data = (Temp_Target as CpfObject)?.GetValue(SourcePropertyNames.LastOrDefault());
Owner.SetPropretyValue(TargetPropertyName, data);
} }
RegisterPropertyChanged(sender as INotifyPropertyChanged);
RegisterPropertyChanged(sender as CpfObject);
} }
internal void RegisterPropertyChanged(INotifyPropertyChanged notify) internal void RegisterPropertyChanged(INotifyPropertyChanged notify)
@ -629,13 +624,25 @@ namespace CPF
//{ //{
// throw new Exception("错误"); // throw new Exception("错误");
//} //}
var Temp_SourcePropertyName = string.Join(".", this.SourcePropertyName.Split('.').Skip(this.SourcePropertyIndex)); var SourcePropertyNames = SourcePropertyName.Split('.');
var notifySource = GetPropertySource(Temp_SourcePropertyName, notify); if (SourcePropertyNames.Length == 1)
if (notifySource == null)
{ {
RegisterPropertyChanged(notify, PropertyChanged);
return; 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) internal void CancellationPropertyChanged(INotifyPropertyChanged notify)
{ {