From e138bc8896cad94b4bd1b2176eef17a72d323606 Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Sun, 16 May 2021 16:29:51 +0100 Subject: [PATCH] Update For Property Binding to make it easier to use Nullable ViewModels and ViewModel Properties Updated Bind, OneWayBind and BindTo to allow nullable properties to be selected with less decorators. Sub properties will still require ! and ? operators as required. The Aim is to have less of an impact to those users upgrading older code. --- ...provalTests.ReactiveUI.net472.approved.txt | 36 +++++------ ...provalTests.ReactiveUI.net5.0.approved.txt | 36 +++++------ ...ests.ReactiveUI.netcoreapp3.1.approved.txt | 36 +++++------ .../windows-xaml/PropertyBindingTest.cs | 62 +++++++++---------- .../Property/IPropertyBinderImplementation.cs | 18 +++--- .../Property/PropertyBinderImplementation.cs | 56 ++++++++--------- .../Property/PropertyBindingMixins.cs | 26 ++++---- 7 files changed, 132 insertions(+), 138 deletions(-) diff --git a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net472.approved.txt b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net472.approved.txt index b4a66abcd1..66195a7794 100644 --- a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net472.approved.txt +++ b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net472.approved.txt @@ -234,25 +234,25 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor ; [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor ; - System.IDisposable BindTo(System.IObservable observedChange, TTarget target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + System.IDisposable BindTo(System.IObservable observedChange, TTarget? target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class ; - ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor ; - ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor ; @@ -492,21 +492,21 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public System.IDisposable BindTo(System.IObservable observedChange, TTarget target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public System.IDisposable BindTo(System.IObservable observedChange, TTarget? target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class { } - public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } @@ -515,33 +515,33 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func vmToViewConverter, System.Func viewToVmConverter) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { + [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public static System.IDisposable BindTo(this System.IObservable @this, TTarget target, System.Linq.Expressions.Expression> property, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public static System.IDisposable BindTo(this System.IObservable @this, TTarget? target, System.Linq.Expressions.Expression> property, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class { } - public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } diff --git a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net5.0.approved.txt b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net5.0.approved.txt index b9cee75035..9f28cb433a 100644 --- a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net5.0.approved.txt +++ b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.net5.0.approved.txt @@ -234,21 +234,21 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor; [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor; - System.IDisposable BindTo(System.IObservable observedChange, TTarget target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + System.IDisposable BindTo(System.IObservable observedChange, TTarget? target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class; - ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor; - ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor; } @@ -487,21 +487,21 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public System.IDisposable BindTo(System.IObservable observedChange, TTarget target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public System.IDisposable BindTo(System.IObservable observedChange, TTarget? target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class { } - public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } @@ -510,33 +510,33 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func vmToViewConverter, System.Func viewToVmConverter) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { + [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public static System.IDisposable BindTo(this System.IObservable @this, TTarget target, System.Linq.Expressions.Expression> property, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public static System.IDisposable BindTo(this System.IObservable @this, TTarget? target, System.Linq.Expressions.Expression> property, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class { } - public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } diff --git a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.netcoreapp3.1.approved.txt b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.netcoreapp3.1.approved.txt index 2dd1be270f..1102562a15 100644 --- a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.netcoreapp3.1.approved.txt +++ b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.netcoreapp3.1.approved.txt @@ -232,21 +232,21 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor; [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor; - System.IDisposable BindTo(System.IObservable observedChange, TTarget target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + System.IDisposable BindTo(System.IObservable observedChange, TTarget? target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class; - ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor; - ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor; } @@ -485,21 +485,21 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public ReactiveUI.IReactiveBinding> Bind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public System.IDisposable BindTo(System.IObservable observedChange, TTarget target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public System.IDisposable BindTo(System.IObservable observedChange, TTarget? target, System.Linq.Expressions.Expression> propertyExpression, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class { } - public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public ReactiveUI.IReactiveBinding OneWayBind(TViewModel? viewModel, TView view, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } @@ -508,33 +508,33 @@ namespace ReactiveUI [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func vmToViewConverter, System.Func viewToVmConverter) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { + [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, System.Func vmToViewConverter, System.Func viewToVmConverter) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } [return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "view", "isViewModel"})] - public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) + public static ReactiveUI.IReactiveBinding> Bind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.IObservable? signalViewUpdate, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null, ReactiveUI.IBindingTypeConverter? viewToVMConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public static System.IDisposable BindTo(this System.IObservable @this, TTarget target, System.Linq.Expressions.Expression> property, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public static System.IDisposable BindTo(this System.IObservable @this, TTarget? target, System.Linq.Expressions.Expression> property, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class { } - public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) + public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, System.Func selector) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } - public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) + public static ReactiveUI.IReactiveBinding OneWayBind(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> vmProperty, System.Linq.Expressions.Expression> viewProperty, object? conversionHint = null, ReactiveUI.IBindingTypeConverter? vmToViewConverterOverride = null) where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } diff --git a/src/ReactiveUI.Tests/Platforms/windows-xaml/PropertyBindingTest.cs b/src/ReactiveUI.Tests/Platforms/windows-xaml/PropertyBindingTest.cs index 3a49cac01d..3b28e4a8be 100644 --- a/src/ReactiveUI.Tests/Platforms/windows-xaml/PropertyBindingTest.cs +++ b/src/ReactiveUI.Tests/Platforms/windows-xaml/PropertyBindingTest.cs @@ -30,7 +30,7 @@ public class PropertyBindingTest [UseInvariantCulture] public void TwoWayBindWithFuncConvertersSmokeTest() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var fixture = new PropertyBinderImplementation(); @@ -58,7 +58,7 @@ public void TwoWayBindWithFuncConvertersSmokeTest() [Fact] public void TwoWayBindSmokeTest() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var fixture = new PropertyBinderImplementation(); @@ -86,7 +86,7 @@ public void TwoWayBindSmokeTest() [Fact] public void TypeConvertedTwoWayBindSmokeTest() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var fixture = new PropertyBinderImplementation(); @@ -152,10 +152,10 @@ public void TypeConvertedTwoWayBindSmokeTest() [Fact] public void BindingIntoModelObjects() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; - view.OneWayBind(view.ViewModel, x => x!.Model!.AnotherThing, x => x.SomeTextBox.Text); + view.OneWayBind(view.ViewModel, x => x.Model!.AnotherThing, x => x.SomeTextBox.Text); Assert.Equal("Baz", view.SomeTextBox.Text); } @@ -165,7 +165,7 @@ public void BindingIntoModelObjects() [Fact] public void ViewModelNullableToViewNonNullable() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.Bind(view.ViewModel, x => x.NullableDouble, x => x.FakeControl.JustADouble); @@ -187,7 +187,7 @@ public void ViewModelNullableToViewNonNullable() [Fact] public void ViewModelNonNullableToViewNullable() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.Bind(view.ViewModel, x => x.JustADouble, x => x.FakeControl.NullableDouble); @@ -209,7 +209,7 @@ public void ViewModelNonNullableToViewNullable() [Fact] public void ViewModelNullableToViewNullable() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.Bind(view.ViewModel, x => x.NullableDouble, x => x.FakeControl.NullableDouble); @@ -231,7 +231,7 @@ public void ViewModelNullableToViewNullable() [Fact] public void ViewModelIndexerToView() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.OneWayBind(view.ViewModel, x => x.SomeCollectionOfStrings[0], x => x.SomeTextBox.Text); @@ -244,7 +244,7 @@ public void ViewModelIndexerToView() [Fact] public void ViewModelIndexerToViewChanges() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.OneWayBind(view.ViewModel, x => x.SomeCollectionOfStrings[0], x => x.SomeTextBox.Text); @@ -261,7 +261,7 @@ public void ViewModelIndexerToViewChanges() [Fact] public void ViewModelIndexerPropertyToView() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.OneWayBind(view.ViewModel, x => x.SomeCollectionOfStrings[0].Length, x => x.SomeTextBox.Text); @@ -274,14 +274,14 @@ public void ViewModelIndexerPropertyToView() [Fact] public void OneWayBindShouldntInitiallySetToNull() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = null }; - view.OneWayBind(vm, x => x!.Model!.AnotherThing, x => x.FakeControl.NullHatingString); + view.OneWayBind(vm, x => x.Model!.AnotherThing, x => x.FakeControl.NullHatingString); Assert.Equal(string.Empty, view.FakeControl.NullHatingString); view.ViewModel = vm; - Assert.Equal(vm!.Model!.AnotherThing, view.FakeControl.NullHatingString); + Assert.Equal(vm.Model!.AnotherThing, view.FakeControl.NullHatingString); } /// @@ -290,7 +290,7 @@ public void OneWayBindShouldntInitiallySetToNull() [Fact] public void BindToTypeConversionSmokeTest() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = null }; Assert.Equal(string.Empty, view.FakeControl.NullHatingString); @@ -312,7 +312,7 @@ public void BindToNullShouldThrowHelpfulError() Assert.Throws(() => view.WhenAnyValue(x => x.FakeControl!.NullHatingString!) - .BindTo(view!.ViewModel!, x => x!.Property1)); + .BindTo(view.ViewModel, x => x.Property1)); } /// @@ -321,7 +321,7 @@ public void BindToNullShouldThrowHelpfulError() [Fact] public void TwoWayBindToSelectedItemOfItemsControl() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.FakeItemsControl.ItemsSource = new ObservableCollectionExtended(new[] { "aaa", "bbb", "ccc" }); @@ -343,7 +343,7 @@ public void TwoWayBindToSelectedItemOfItemsControl() [Fact] public void ItemsControlShouldGetADataTemplate() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; Assert.Null(view.FakeItemsControl.ItemTemplate); @@ -358,7 +358,7 @@ public void ItemsControlShouldGetADataTemplate() [Fact] public void ItemsControlWithDisplayMemberPathSetShouldNotGetADataTemplate() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.FakeItemsControl.DisplayMemberPath = "Bla"; @@ -374,7 +374,7 @@ public void ItemsControlWithDisplayMemberPathSetShouldNotGetADataTemplate() [Fact] public void ItemsControlShouldGetADataTemplateInBindTo() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; Assert.Null(view.FakeItemsControl.ItemTemplate); @@ -393,7 +393,7 @@ public void ItemsControlShouldGetADataTemplateInBindTo() [Fact] public void BindingToItemsControl() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.OneWayBind(view.ViewModel, x => x.SomeCollectionOfStrings, x => x.FakeItemsControl.ItemsSource); @@ -408,7 +408,7 @@ public void BindingToItemsControl() [Fact] public void OneWayBindConverter() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var fixture = new PropertyBinderImplementation(); fixture.OneWayBind(vm, view, x => x.JustABoolean, x => x.SomeTextBox.IsEnabled, s => s); @@ -421,7 +421,7 @@ public void OneWayBindConverter() [Fact] public void OneWayBindWithNullStartingValueToNonNullValue() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.OneWayBind(vm, x => x.Property1, x => x.SomeTextBox.Text); @@ -437,7 +437,7 @@ public void OneWayBindWithNullStartingValueToNonNullValue() [Fact] public void OneWayBindWithNonNullStartingValueToNullValue() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; vm.Property1 = "Baz"; @@ -455,7 +455,7 @@ public void OneWayBindWithNonNullStartingValueToNullValue() [Fact] public void OneWayBindWithSelectorAndNonNullStartingValueToNullValue() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.OneWayBind(vm, x => x.Model, x => x.SomeTextBox.Text, x => x?.AnotherThing); @@ -473,7 +473,7 @@ public void OneWayBindInitialViewModelShouldBeGarbageCollectedWhenOverwritten() { static (IDisposable?, WeakReference) GetWeakReference() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var weakRef = new WeakReference(vm); var disp = view.OneWayBind(vm, x => x.Property1, x => x.SomeTextBox.Text); @@ -496,7 +496,7 @@ public void OneWayBindInitialViewModelShouldBeGarbageCollectedWhenOverwritten() [Fact] public void BindToWithNullStartingValueToNonNullValue() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.WhenAnyValue(x => x.ViewModel!.Property1) @@ -513,7 +513,7 @@ public void BindToWithNullStartingValueToNonNullValue() [Fact] public void BindToWithNonNullStartingValueToNullValue() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; vm.Property1 = "Baz"; @@ -532,7 +532,7 @@ public void BindToWithNonNullStartingValueToNullValue() [Fact] public void BindExpectsConverterFuncsToNotBeNull() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var fixture = new PropertyBinderImplementation(); @@ -548,7 +548,7 @@ public void BindExpectsConverterFuncsToNotBeNull() [Fact] public void BindWithFuncShouldWorkAsExtensionMethodSmokeTest() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; view.Bind(vm, x => x.JustADecimal, x => x.SomeTextBox.Text, d => d.ToString(CultureInfo.InvariantCulture), decimal.Parse); @@ -562,7 +562,7 @@ public void BindInitialViewModelShouldBeGarbageCollectedWhenOverwritten() { static (IDisposable?, WeakReference) GetWeakReference() { - var vm = new PropertyBindViewModel(); + PropertyBindViewModel? vm = new(); var view = new PropertyBindView { ViewModel = vm }; var weakRef = new WeakReference(vm); var disp = view.Bind(vm, x => x.Property1, x => x.SomeTextBox.Text); diff --git a/src/ReactiveUI/Bindings/Property/IPropertyBinderImplementation.cs b/src/ReactiveUI/Bindings/Property/IPropertyBinderImplementation.cs index 6406ec8356..d130b27c7b 100644 --- a/src/ReactiveUI/Bindings/Property/IPropertyBinderImplementation.cs +++ b/src/ReactiveUI/Bindings/Property/IPropertyBinderImplementation.cs @@ -68,7 +68,7 @@ public interface IPropertyBinderImplementation : IEnableLogger IReactiveBinding Bind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, object? conversionHint, @@ -125,11 +125,11 @@ public interface IPropertyBinderImplementation : IEnableLogger IReactiveBinding Bind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, - Func vmToViewConverter, - Func viewToVmConverter) + Func vmToViewConverter, + Func viewToVmConverter) where TViewModel : class where TView : class, IViewFor; @@ -175,7 +175,7 @@ public interface IPropertyBinderImplementation : IEnableLogger IReactiveBinding OneWayBind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, object? conversionHint, IBindingTypeConverter? vmToViewConverterOverride = null) @@ -216,9 +216,9 @@ IReactiveBinding OneWayBind( IReactiveBinding OneWayBind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, - Func selector) + Func selector) where TViewModel : class where TView : class, IViewFor; @@ -248,8 +248,8 @@ IReactiveBinding OneWayBind( /// An object that when disposed, disconnects the binding. IDisposable BindTo( IObservable observedChange, - TTarget target, - Expression> propertyExpression, + TTarget? target, + Expression> propertyExpression, object? conversionHint, IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class; diff --git a/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs b/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs index 84ce009b14..eda407f2cf 100644 --- a/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs +++ b/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs @@ -58,7 +58,7 @@ static PropertyBinderImplementation() public IReactiveBinding Bind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, object? conversionHint, @@ -76,27 +76,21 @@ static PropertyBinderImplementation() $"Can't two-way convert between {typeof(TVMProp)} and {typeof(TVProp)}. To fix this, register a IBindingTypeConverter or call the version with the converter Func."); } -#pragma warning disable CS8601 // Possible null reference assignment. - bool VmToViewFunc(TVMProp vmValue, out TVProp vValue) + bool VmToViewFunc(TVMProp? vmValue, out TVProp vValue) { var result = vmToViewConverter.TryConvert(vmValue, typeof(TVProp), conversionHint, out object? tmp); -#pragma warning disable CS8605 // Unboxing a possibly null value. - vValue = result && tmp != null ? (TVProp)tmp : default; -#pragma warning restore CS8605 // Unboxing a possibly null value. + vValue = result && tmp != null ? (TVProp)tmp : default!; return result; } - bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) + bool ViewToVmFunc(TVProp vValue, out TVMProp? vmValue) { - var result = viewToVMConverter.TryConvert(vValue, typeof(TVMProp), conversionHint, out object? tmp); + var result = viewToVMConverter.TryConvert(vValue, typeof(TVMProp?), conversionHint, out object? tmp); -#pragma warning disable CS8605 // Unboxing a possibly null value. - vmValue = result && tmp != null ? (TVMProp)tmp : default; -#pragma warning restore CS8605 // Unboxing a possibly null value. + vmValue = result && tmp != null ? (TVMProp?)tmp : default; return result; } -#pragma warning restore CS8601 // Possible null reference assignment. return BindImpl(viewModel, view, vmProperty, viewProperty, signalViewUpdate, VmToViewFunc, ViewToVmFunc); } @@ -105,11 +99,11 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) public IReactiveBinding Bind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, - Func vmToViewConverter, - Func viewToVmConverter) + Func vmToViewConverter, + Func viewToVmConverter) where TViewModel : class where TView : class, IViewFor { @@ -133,13 +127,13 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) throw new ArgumentNullException(nameof(viewToVmConverter)); } - bool VmToViewFunc(TVMProp vmValue, out TVProp vValue) + bool VmToViewFunc(TVMProp? vmValue, out TVProp vValue) { vValue = vmToViewConverter(vmValue); return true; } - bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) + bool ViewToVmFunc(TVProp vValue, out TVMProp? vmValue) { vmValue = viewToVmConverter(vValue); return true; @@ -152,7 +146,7 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) public IReactiveBinding OneWayBind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, object? conversionHint = null, IBindingTypeConverter? vmToViewConverterOverride = null) @@ -172,7 +166,7 @@ public IReactiveBinding OneWayBind OneWayBind OneWayBind( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, - Func selector) + Func selector) where TViewModel : class where TView : class, IViewFor { @@ -229,7 +223,7 @@ public IReactiveBinding OneWayBind( return new ReactiveBinding(view, viewExpression, vmExpression, Observable.Empty(), BindingDirection.OneWay, Disposable.Empty); } - var source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmExpression).Cast().Select(selector); + var source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmExpression).Cast().Select(selector); var (disposable, obs) = BindToDirect(source, view, viewExpression); @@ -239,8 +233,8 @@ public IReactiveBinding OneWayBind( /// public IDisposable BindTo( IObservable observedChange, - TTarget target, - Expression> propertyExpression, + TTarget? target, + Expression> propertyExpression, object? conversionHint = null, IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class @@ -263,7 +257,7 @@ public IDisposable BindTo( return Disposable.Empty; } - var converter = vmToViewConverterOverride ?? GetConverterForTypes(typeof(TValue), typeof(TTValue)); + var converter = vmToViewConverterOverride ?? GetConverterForTypes(typeof(TValue), typeof(TTValue?)); if (converter == null) { @@ -272,7 +266,7 @@ public IDisposable BindTo( var source = observedChange.SelectMany(x => { - if (!converter.TryConvert(x, typeof(TTValue), conversionHint, out var tmp)) + if (!converter.TryConvert(x, typeof(TTValue?), conversionHint, out var tmp)) { return Observable.Empty; } @@ -280,7 +274,7 @@ public IDisposable BindTo( return Observable.Return(tmp); }); - var (disposable, _) = BindToDirect(source, target, viewExpression); + var (disposable, _) = BindToDirect(source, target, viewExpression); return disposable; } @@ -414,11 +408,11 @@ private bool EvalBindingHooks(TViewModel? viewModel, TView vi private IReactiveBinding BindImpl( TViewModel? viewModel, TView view, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, - OutFunc vmToViewConverter, - OutFunc viewToVmConverter) + OutFunc vmToViewConverter, + OutFunc viewToVmConverter) where TView : class, IViewFor where TViewModel : class { @@ -463,7 +457,7 @@ private bool EvalBindingHooks(TViewModel? viewModel, TView vi return (true, vmAsView, isVm); } - if (!viewToVmConverter(vValue, out TVMProp vAsViewModel) || EqualityComparer.Default.Equals(vmValue, vAsViewModel)) + if (!viewToVmConverter(vValue, out TVMProp? vAsViewModel) || EqualityComparer.Default.Equals(vmValue, vAsViewModel)) { return (false, null, false); } diff --git a/src/ReactiveUI/Bindings/Property/PropertyBindingMixins.cs b/src/ReactiveUI/Bindings/Property/PropertyBindingMixins.cs index 8edcb553d1..86a58059e0 100644 --- a/src/ReactiveUI/Bindings/Property/PropertyBindingMixins.cs +++ b/src/ReactiveUI/Bindings/Property/PropertyBindingMixins.cs @@ -60,7 +60,7 @@ static PropertyBindingMixins() public static IReactiveBinding Bind( this TView view, TViewModel? viewModel, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, object? conversionHint = null, IBindingTypeConverter? vmToViewConverterOverride = null, @@ -125,7 +125,7 @@ static PropertyBindingMixins() public static IReactiveBinding Bind( this TView view, TViewModel? viewModel, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, object? conversionHint = null, @@ -169,10 +169,10 @@ static PropertyBindingMixins() public static IReactiveBinding Bind( this TView view, TViewModel? viewModel, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, - Func vmToViewConverter, - Func viewToVmConverter) + Func vmToViewConverter, + Func viewToVmConverter) where TViewModel : class where TView : class, IViewFor => binderImplementation.Bind(viewModel, view, vmProperty, viewProperty, (IObservable?)null, vmToViewConverter, viewToVmConverter); @@ -219,11 +219,11 @@ static PropertyBindingMixins() public static IReactiveBinding Bind( this TView view, TViewModel? viewModel, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, IObservable? signalViewUpdate, - Func vmToViewConverter, - Func viewToVmConverter) + Func vmToViewConverter, + Func viewToVmConverter) where TViewModel : class where TView : class, IViewFor => binderImplementation.Bind(viewModel, view, vmProperty, viewProperty, signalViewUpdate, vmToViewConverter, viewToVmConverter); @@ -267,7 +267,7 @@ static PropertyBindingMixins() public static IReactiveBinding OneWayBind( this TView view, TViewModel? viewModel, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, object? conversionHint = null, IBindingTypeConverter? vmToViewConverterOverride = null) @@ -314,9 +314,9 @@ public static IReactiveBinding OneWayBind OneWayBind( this TView view, TViewModel? viewModel, - Expression> vmProperty, + Expression> vmProperty, Expression> viewProperty, - Func selector) + Func selector) where TViewModel : class where TView : class, IViewFor => binderImplementation.OneWayBind(viewModel, view, vmProperty, viewProperty, selector); @@ -347,8 +347,8 @@ public static IReactiveBinding OneWayBindAn object that when disposed, disconnects the binding. public static IDisposable BindTo( this IObservable @this, - TTarget target, - Expression> property, + TTarget? target, + Expression> property, object? conversionHint = null, IBindingTypeConverter? vmToViewConverterOverride = null) where TTarget : class =>