Avalonia.Labs.CommandManager 12.0.2
Avalonia.Labs.CommandManager
Experimental WPF-like implementation of RoutedCommand.
the currently supported flow is this:
sequenceDiagram
participant RotendCommand
participant View
participant CommandManager
participant ViewModel
participant TopLevel
TopLevel->>CommandManager: Got Focus
CommandManager->>RotendCommand: Raise CanExecuteChanged
RotendCommand->>View: Raise CommandManager.CanExecuteEvent
View->>CommandManager: Raise CommandManager.CanExecuteEvent
CommandManager->>ViewModel: ICommand.CanExecute
CommandManager->>RotendCommand: Handle=True
RotendCommand->>View: Raise CommandManager.ExecuteEvent
View->>CommandManager: Raise CommandManager.ExecuteEvent
CommandManager->>ViewModel: ICommand.Execute
Get Started
Install package
dotnet add package package Avalonia.Labs.CommandManagerAdd XML Namespace
<UserControl xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:lab="using:Avalonia.Labs.Catalog" + xmlns:rc="using:Avalonia.Labs.Input" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" xmlns:viewModels="using:Avalonia.Labs.Catalog.ViewModels" x:Class="Avalonia.Labs.Catalog.Views.RouteCommandView" x:DataType="viewModels:RouteCommandViewModel" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" > ... </UserControl>Define your's RouterCommands
public static class ApplicationCommands { public readonly static RoutedCommand Open = new RoutedCommand(nameof(Open)); public readonly static RoutedCommand Save = new RoutedCommand(nameof(Save)); }Assign your
RotedCommand<UniformGrid Columns="2" Grid.Column="2"> <Button Content="Open" Command="{x:Static lab:ApplicationCommands.Open}" CommandParameter="{Binding .}"/> <Button Content="Save" Command="{x:Static lab:ApplicationCommands.Save}" CommandParameter="{Binding .}"/> </UniformGrid>Binding
RouterCommandto yours ViewModel<UserControl xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:lab="using:Avalonia.Labs.Catalog" xmlns:rc="using:Avalonia.Labs.Input" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" xmlns:viewModels="using:Avalonia.Labs.Catalog.ViewModels" x:Class="Avalonia.Labs.Catalog.Views.RouteCommandView" x:DataType="viewModels:RouteCommandViewModel" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" > <rc:CommandManager.CommandBindings> <rc:CommandBinding Command="{x:Static lab:ApplicationCommands.Open}" ExecutingCommand="{Binding Open}" /> <rc:CommandBinding Command="{x:Static lab:ApplicationCommands.Save}" ExecutingCommand="{Binding Save}" /> </rc:CommandManager.CommandBindings> ... </UserControl>
You can view full sample here.
Todo
- CommandTarget (requires modification in Avalonia).
No packages depend on Avalonia.Labs.CommandManager.