Créer une App Moderne — Avalonia UI & .NET

🕹️ Module 4 — Interagir proprement avec les Commandes

Transformer l'intention utilisateur en action testable côté ViewModel.

Créer une App Moderne — Avalonia UI & .NET

📝 Changelog

  • Passage du simple affichage à une vraie saisie utilisateur.
  • Introduction de ICommand via CommunityToolkit.Mvvm.
  • La tâche tapée dans l'UI peut maintenant être ajoutée à la liste.
  • Ajout de TodoItemViewModel avec IsDone et commande de suppression.
Créer une App Moderne — Avalonia UI & .NET

Objectif du module

  • Lier le champ texte au ViewModel.
  • Lier le bouton à une commande.
  • Ajouter dynamiquement une tâche dans la collection.
  • Comprendre l'inversion de flux événementiel.
Créer une App Moderne — Avalonia UI & .NET

Binding côté saisie et côté action

<TextBox Text="{Binding NouvelleTache}" />
<Button Command="{Binding AjouterTacheCommand}" Content="Ajouter" />
  • Le champ pousse une valeur.
  • Le bouton déclenche une intention.
Créer une App Moderne — Avalonia UI & .NET

Le concept clé: ICommand

  • Le bouton ne connaît pas la logique métier.
  • Il exécute une commande exposée par le ViewModel.
  • La logique se teste sans interface graphique.
  • On peut désactiver le bouton selon l'état courant.
Créer une App Moderne — Avalonia UI & .NET

Illustration du pipeline de commande

Créer une App Moderne — Avalonia UI & .NET

Séquence : intention vers action

Créer une App Moderne — Avalonia UI & .NET

Exemple ViewModel

[ObservableProperty]
private string? nouvelleTache;

[RelayCommand]
private void AjouterTache()
{
    if (string.IsNullOrWhiteSpace(NouvelleTache)) return;
    Taches.Add(NouvelleTache.Trim());
    NouvelleTache = string.Empty;
}
Créer une App Moderne — Avalonia UI & .NET

Pourquoi c'est plus propre que Click="..."

  • Le XAML reste déclaratif.
  • Le ViewModel centralise l'état et les décisions.
  • Le même code est réutilisable pour d'autres vues.
  • Les dépendances futures seront injectables.
Créer une App Moderne — Avalonia UI & .NET

Représenter une tâche avec état

Un string ne suffit plus dès qu'on veut cocher ou supprimer.

public partial class TodoItemViewModel : ObservableObject
{
    [ObservableProperty]
    private string title = string.Empty;

    [ObservableProperty]
    private bool isDone;
}
  • Chaque tâche devient un objet observable.
  • IsDone se lie directement à une CheckBox en XAML.
Créer une App Moderne — Avalonia UI & .NET

Supprimer et basculer une tâche

// TodoListViewModel — Taches passe de string à TodoItemViewModel
public ObservableCollection<TodoItemViewModel> Taches { get; } = new();

[RelayCommand]
private void SupprimerTache(TodoItemViewModel item) => Taches.Remove(item);
<CheckBox IsChecked="{Binding IsDone}" Content="{Binding Title}" />
<Button Command="{Binding $parent[ItemsControl].DataContext.SupprimerTacheCommand}"
        CommandParameter="{Binding}" Content="✕" />
  • CommandParameter transmet l'item concerné à la commande.
  • Le ViewModel reste testable sans interface graphique.
Créer une App Moderne — Avalonia UI & .NET

Attention aux cas limites

  • Saisie vide.
  • Espaces avant et après le texte.
  • Double clic rapide sur Ajouter.
  • Besoin futur d'une commande asynchrone.
Créer une App Moderne — Avalonia UI & .NET

Livrable du module

  • On tape une tâche.
  • On clique sur Ajouter.
  • La liste se met à jour immédiatement.
  • L'écran reste propre, sans code-behind métier.