From 1da2bd6e1a06eab2ebd6ec4991a7aac479f2917e Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Sun, 16 May 2021 19:02:07 +0100 Subject: [PATCH] Update For Property Binding to make it easier to use Nullable ViewModels and ViewModel Properties (#2759) 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 @@ public interface IPropertyBinderImplementation : IEnableLogger 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 @@ public interface IPropertyBinderImplementation : IEnableLogger /// 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) var vmExpression = Reflection.Rewrite(vmProperty.Body); var viewExpression = Reflection.Rewrite(viewProperty.Body); var viewType = viewExpression.Type; - var converter = vmToViewConverterOverride ?? GetConverterForTypes(typeof(TVMProp), viewType); + var converter = vmToViewConverterOverride ?? GetConverterForTypes(typeof(TVMProp?), viewType); if (converter == null) { @@ -205,9 +199,9 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) public IReactiveBinding 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) /// 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) return Observable.Return(tmp); }); - var (disposable, _) = BindToDirect(source, target, viewExpression); + var (disposable, _) = BindToDirect(source, target, viewExpression); return disposable; } @@ -414,11 +408,11 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) 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 @@ bool ViewToVmFunc(TVProp vValue, out TVMProp vmValue) 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 @@ static PropertyBindingMixins() public static IReactiveBinding 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 @@ static PropertyBindingMixins() /// An 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 =>