diff --git a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
index 89e2c096ee..ce104b3609 100644
--- a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
+++ b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
@@ -2,6 +2,7 @@
netstandard2.0
Avalonia
+ Enable
diff --git a/src/Markup/Avalonia.Markup/Data/Binding.cs b/src/Markup/Avalonia.Markup/Data/Binding.cs
index bf43730481..554c27b85a 100644
--- a/src/Markup/Avalonia.Markup/Data/Binding.cs
+++ b/src/Markup/Avalonia.Markup/Data/Binding.cs
@@ -39,17 +39,17 @@ namespace Avalonia.Data
///
/// Gets or sets the name of the element to use as the binding source.
///
- public string ElementName { get; set; }
+ public string? ElementName { get; set; }
///
/// Gets or sets the relative source for the binding.
///
- public RelativeSource RelativeSource { get; set; }
+ public RelativeSource? RelativeSource { get; set; }
///
/// Gets or sets the source for the binding.
///
- public object Source { get; set; }
+ public object? Source { get; set; }
///
/// Gets or sets the binding path.
@@ -59,20 +59,21 @@ namespace Avalonia.Data
///
/// Gets or sets a function used to resolve types from names in the binding path.
///
- public Func TypeResolver { get; set; }
+ public Func? TypeResolver { get; set; }
- protected override ExpressionObserver CreateExpressionObserver(IAvaloniaObject target, AvaloniaProperty targetProperty, object anchor, bool enableDataValidation)
+ protected override ExpressionObserver CreateExpressionObserver(IAvaloniaObject target, AvaloniaProperty targetProperty, object? anchor, bool enableDataValidation)
{
- Contract.Requires(target != null);
+ Contract.Requires(target is not null);
anchor = anchor ?? DefaultAnchor?.Target;
enableDataValidation = enableDataValidation && Priority == BindingPriority.LocalValue;
- INameScope nameScope = null;
+ INameScope? nameScope = null;
NameScope?.TryGetTarget(out nameScope);
var (node, mode) = ExpressionObserverBuilder.Parse(Path, enableDataValidation, TypeResolver, nameScope);
+#nullable disable
if (ElementName != null)
{
return CreateElementObserver(
@@ -138,5 +139,6 @@ namespace Avalonia.Data
throw new NotSupportedException();
}
}
+#nullable enable
}
}
diff --git a/src/Markup/Avalonia.Markup/Data/BindingBase.cs b/src/Markup/Avalonia.Markup/Data/BindingBase.cs
index 3dbc83a7df..b900a043d7 100644
--- a/src/Markup/Avalonia.Markup/Data/BindingBase.cs
+++ b/src/Markup/Avalonia.Markup/Data/BindingBase.cs
@@ -38,22 +38,22 @@ namespace Avalonia.Data
///
/// Gets or sets the to use.
///
- public IValueConverter Converter { get; set; }
+ public IValueConverter? Converter { get; set; }
///
/// Gets or sets a parameter to pass to .
///
- public object ConverterParameter { get; set; }
+ public object? ConverterParameter { get; set; }
///
/// Gets or sets the value to use when the binding is unable to produce a value.
///
- public object FallbackValue { get; set; }
+ public object? FallbackValue { get; set; }
///
/// Gets or sets the value to use when the binding result is null.
///
- public object TargetNullValue { get; set; }
+ public object? TargetNullValue { get; set; }
///
/// Gets or sets the binding mode.
@@ -68,23 +68,23 @@ namespace Avalonia.Data
///
/// Gets or sets the string format.
///
- public string StringFormat { get; set; }
+ public string? StringFormat { get; set; }
- public WeakReference DefaultAnchor { get; set; }
+ public WeakReference? DefaultAnchor { get; set; }
- public WeakReference NameScope { get; set; }
+ public WeakReference? NameScope { get; set; }
protected abstract ExpressionObserver CreateExpressionObserver(
IAvaloniaObject target,
AvaloniaProperty targetProperty,
- object anchor,
+ object? anchor,
bool enableDataValidation);
///
public InstancedBinding Initiate(
IAvaloniaObject target,
AvaloniaProperty targetProperty,
- object anchor = null,
+ object? anchor = null,
bool enableDataValidation = false)
{
Contract.Requires(target != null);
@@ -133,18 +133,13 @@ namespace Avalonia.Data
IAvaloniaObject target,
ExpressionNode node,
bool targetIsDataContext,
- object anchor)
+ object? anchor)
{
Contract.Requires(target != null);
if (!(target is IDataContextProvider))
{
- target = anchor as IDataContextProvider;
-
- if (target == null)
- {
- throw new InvalidOperationException("Cannot find a DataContext to bind to.");
- }
+ target = anchor as IDataContextProvider ?? throw new InvalidOperationException("Cannot find a DataContext to bind to.");
}
if (!targetIsDataContext)
@@ -173,8 +168,7 @@ namespace Avalonia.Data
{
Contract.Requires(target != null);
- NameScope.TryGetTarget(out var scope);
- if (scope == null)
+ if (NameScope is null || !NameScope.TryGetTarget(out var scope) || scope is null)
throw new InvalidOperationException("Name scope is null or was already collected");
var result = new ExpressionObserver(
NameScopeLocator.Track(scope, elementName),
@@ -190,7 +184,7 @@ namespace Avalonia.Data
{
Contract.Requires(target != null);
- IObservable