FastBindings.MAUI 1.1.2

There is a newer version of this package available.
See the version list below for details.
dotnet add package FastBindings.MAUI --version 1.1.2                
NuGet\Install-Package FastBindings.MAUI -Version 1.1.2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FastBindings.MAUI" Version="1.1.2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FastBindings.MAUI --version 1.1.2                
#r "nuget: FastBindings.MAUI, 1.1.2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install FastBindings.MAUI as a Cake Addin
#addin nuget:?package=FastBindings.MAUI&version=1.1.2

// Install FastBindings.MAUI as a Cake Tool
#tool nuget:?package=FastBindings.MAUI&version=1.1.2                

#FastBinding vs AsyncFastBinding

IDEA

One of the bottlenecks where WPF application loses performance is in the bindings. Unfortunatelly binding access to ViewModel properties through reflection. The existing mechanism is a monolith that is closed for changes from outside. It can be improved if access to ViewModel properties is done directly, for example, through some contract:

interface IAccessProperties { object GetProperty(string name); void SetProperty(string name, object value); }

REQUIREMENTS

To use new FastBinding we need to implement described contract in ViewModel. Or use class CommonViewModel<T> as parent for ViewModel, if it is possible, or implement it like it is done in CommonViewModel<T>. Under the hood CommonViewModel works with properties through a cached tree expression.


  1. The most effective way --

using FastBindings.Common; public class MainWindowViewModelV2 : BaseViewModel { public override object? GetProperty(string propertyName) { switch (propertyName) { case nameof(Text): return Text; } return null; }

 public override void SetProperty(string propertyName, object? value)
 {
     switch (propertyName)
     {
         case nameof(Text):
             if (value?.GetType() == Text.GetType())
                 Text = (string)value;

             break;
     }
 }

}

  1. Simple and fast way -- using FastBindings.Common; public class MainWindowViewModel : CommonBaseViewModel<MainWindowViewModel>{ .....}

  1. If the parent class already exists --

using FastBindings.Common; using FastBindings.Interfaces; public class MainWindowViewModel : <ParentClass>, IPropertyAccessor { private PropertyHolder<MainWindowViewModel> _holder; public MainWindowViewModel() { _holder = new PropertyHolder<MainWindowViewModel>(); } public object? GetProperty(string propertyName) { return _holder.GetProperty(propertyName); } public void SetProperty(string propertyName, object? value) { _holder.SetProperty(propertyName, value); } }

[Sources]

Property Sources allows to use one or simultaneously few objects and devider between sources ; It supports not only familiar from ViewModels long paths (Outgoing.Notification.Message), but framework properties and events. P.S. Without forward or back converter target will be interact only with first source in list

Formats for framework classes in Sources:

$[[control_name].dependencyProperty(event)] — control on the target level $[[ancsestorType/ancestorsLevel].dependencyProperty(event)] — parent control above target $[[this].dependencyProperty(event)] — target itself

[DataSourcePath]

By default for ViewModel we using DataSource from target element. DataSourcePath property allows us to use DataSource from another place

Formats:

<control_name> (panel)- on the target level <ancsestorType/ancestorsLevel>(ListBox/1)— parent control above

[Converter], [ConverterPath], [ConverterName]

Now converter can be both at StaticResources level (property Converter) and at ViewModel level (ConverterPath), but not simultaneously at the same time. Priority goes from staticResource level converter to ViewModel level converter. And ViewModel level converter requires that converter has concrete name (property ConverterName). User is not required to create simultaneously back and forward initialization. P/S Using a converter guarantees that you can receive any exceptions that the ViewModel property might throw. [ConverterPath] formats see [DataSourcePath] formats

[CacheStrategy]

Property CacheStrategy. It is option to improve efficiency during interaction with ViewModels. None Simple. If user uses few bindings from one ViewModel property(no long form), during update this property it will be read only once

[Notification], [NotificationPath], [NotificationName]

NotificationFilter (from Source to Target, Target to Source) Now it allows us to skip update from Source to Target, Target to Source. [NotificationPath] - path to ViewModel with implemented INotificationFilter For AsyncBinding we receive events not only before and after the update.

[FallbackValue]

If viewModel property returns Exception, WPF will use this value instead

p/s ASYNC FAST BINDING works asynchronously and can operate with Task<?> viewModel property.

Examples: <TextBox Text="{custom:FastBinding Mod.MyProperty;MyProperty1;$[[RRR].ActualWidth], CacheStrategy=Simple, ConverterName=Test, ConverterPath=Mod}" /> <TextBlock Text="{custom:FastBinding Mod.MyProperty;MyProperty2;$[[ListBox/1].ActualWidth], CacheStrategy=Simple,ConverterName=Test, ConverterPath=Mod}" /> <TextBox Text="{custom:AsyncFastBinding Mod.Test, NotificationName =UU, NotificationPath=Mod}" />


NEXT RELEASE

Reactive binding from framework properties and events.

Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-android33.0 is compatible.  net7.0-ios was computed.  net7.0-ios16.1 is compatible.  net7.0-maccatalyst was computed.  net7.0-maccatalyst16.1 is compatible.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net7.0-windows10.0.19041 is compatible.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net7.0

    • No dependencies.
  • net7.0-android33.0

    • No dependencies.
  • net7.0-ios16.1

    • No dependencies.
  • net7.0-maccatalyst16.1

    • No dependencies.
  • net7.0-windows10.0.19041

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.3 119 11/8/2024
1.1.2 96 10/28/2024
1.1.1 94 10/27/2024