/// When implemented in a derived class, unsubscribes from the previous source.
diff --git a/src/Avalonia.Base/Data/Core/ExpressionNodes/FuncTransformNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNodes/FuncTransformNode.cs
index 7ad0b7ee97..1eb15d2469 100644
--- a/src/Avalonia.Base/Data/Core/ExpressionNodes/FuncTransformNode.cs
+++ b/src/Avalonia.Base/Data/Core/ExpressionNodes/FuncTransformNode.cs
@@ -21,8 +21,11 @@ internal sealed class FuncTransformNode : ExpressionNode
// We don't have enough information to add anything here.
}
- protected override void OnSourceChanged(object source, Exception? dataValidationError)
+ protected override void OnSourceChanged(object? source, Exception? dataValidationError)
{
+ if (!ValidateNonNullSource(source))
+ return;
+
SetValue(_transform(source));
}
}
diff --git a/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalAncestorElementNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalAncestorElementNode.cs
index ccf6c76f90..b15f285867 100644
--- a/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalAncestorElementNode.cs
+++ b/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalAncestorElementNode.cs
@@ -56,8 +56,11 @@ internal sealed class LogicalAncestorElementNode : SourceNode
return target is ILogical logical && logical.IsAttachedToLogicalTree;
}
- protected override void OnSourceChanged(object source, Exception? dataValidationError)
+ protected override void OnSourceChanged(object? source, Exception? dataValidationError)
{
+ if (!ValidateNonNullSource(source))
+ return;
+
if (source is ILogical logical)
{
var locator = ControlLocator.Track(logical, _ancestorLevel, _ancestorType);
diff --git a/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalNotNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalNotNode.cs
index bb65ac16dd..8b1102b463 100644
--- a/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalNotNode.cs
+++ b/src/Avalonia.Base/Data/Core/ExpressionNodes/LogicalNotNode.cs
@@ -28,14 +28,12 @@ internal sealed class LogicalNotNode : ExpressionNode, ISettableNode
return false;
}
- protected override void OnSourceChanged(object source, Exception? dataValidationError)
+ protected override void OnSourceChanged(object? source, Exception? dataValidationError)
{
var v = BindingNotification.ExtractValue(source);
if (TryConvert(v, out var value))
- {
SetValue(BindingNotification.UpdateValue(source, !value), dataValidationError);
- }
else
SetError($"Unable to convert '{source}' to bool.");
}
diff --git a/src/Avalonia.Base/Data/Core/ExpressionNodes/MethodCommandNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNodes/MethodCommandNode.cs
index 76ea564320..e0641f1461 100644
--- a/src/Avalonia.Base/Data/Core/ExpressionNodes/MethodCommandNode.cs
+++ b/src/Avalonia.Base/Data/Core/ExpressionNodes/MethodCommandNode.cs
@@ -39,8 +39,11 @@ internal sealed class MethodCommandNode : ExpressionNode, IWeakEventSubscriber(source);
if (_plugin.Start(reference, PropertyName) is { } accessor)
diff --git a/src/Avalonia.Base/Data/Core/ExpressionNodes/Reflection/DynamicPluginPropertyAccessorNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNodes/Reflection/DynamicPluginPropertyAccessorNode.cs
index d1ecc13208..533520d35c 100644
--- a/src/Avalonia.Base/Data/Core/ExpressionNodes/Reflection/DynamicPluginPropertyAccessorNode.cs
+++ b/src/Avalonia.Base/Data/Core/ExpressionNodes/Reflection/DynamicPluginPropertyAccessorNode.cs
@@ -42,8 +42,11 @@ internal sealed class DynamicPluginPropertyAccessorNode : ExpressionNode, IPrope
return _accessor?.SetValue(value, BindingPriority.LocalValue) ?? false;
}
- protected override void OnSourceChanged(object source, Exception? dataValidationError)
+ protected override void OnSourceChanged(object? source, Exception? dataValidationError)
{
+ if (!ValidateNonNullSource(source))
+ return;
+
var reference = new WeakReference