Peut-on lier des données (Binding) à une DirectProperty ?
Oui, sans aucun problème. Dans votre interface axaml, vous pouvez utiliser une DirectProperty avec des liaisons de données ({Binding}) comme n'importe quelle autre propriété.
Mais (ceci est important) :
- La liaison de données (Data Binding) fonctionne : vous pouvez lier une propriété de votre ViewModel à une DirectProperty.
- La liaison de style (Styling) ne fonctionne pas : vous ne pouvez pas définir une DirectProperty dans un Setter d'un Style.
Ceci s'explique par le fait que la DirectProperty est conçue pour les performances. Elle contourne le moteur complexe de priorisation des styles d'Avalonia pour accéder directemetn au champ de votre classe.
Comment définir une valeur par défaut pour une DirectProperty ?
Pour une StyledProperty, la valeur par défaut est spécifiée lors de l'enregistrement de la propriété via le paramètre defaultValue. Avec une DirectProperty, la valeur par défaut correspond simplement à la valeur initiale du champ C# privé.
En effet, la DirectProperty fait directement référence à votre champ, le n'ayant pas besoin de stocker séparément la valeur par défaut.
Exemple de code : Mise en pratique
Voici un exemple complet comparant les approches pour définir une propriété, lui attribuer une valeur par défaut et notifier les changements internement :
public class MonControlePersonnalise : Control
{
// 1. Définir le champ privé avec sa valeur par défaut
private string _nomFichier = "Defaut.txt";
// 2. Enregistrer la DirectProperty
public static readonly DirectProperty<MonControlePersonnalise, string> NomFichierProperty =
AvaloniaProperty.RegisterDirect<MonControlePersonnalise, string>(
nameof(NomFichier), // Nom de la propriété
o => o.NomFichier, // Getter (lecture)
(o, v) => o.NomFichier = v // Setter (écriture)
);
// 3. Wrapper de la propriété
public string NomFichier
{
get => _nomFichier;
set
{
// Utiliser SetAndRaise pour notifier le changement
// Cela informe le framework Avalonia que la propriété a changé
SetAndRaise(NomFichierProperty, ref _nomFichier, value);
}
}
}
Utilisation en XAML
Même si c'est une DirectProperty, l'utilisation en XAML reste identique à celle d'une propriété standard :
<StackPanel>
<local:MonControlePersonnalise NomFichier="Projet.docx" />
<local:MonControlePersonnalise NomFichier="{Binding FichierActuel}" />
<TextBlock Text="{Binding #monCtrl.NomFichier}" Name="monCtrl" />
</StackPanel>
Conclusion : Comment choisir ?
Pour vous aider à décider, voici une logique simple :
- Cette propriété a-t-elle besoin de supporter les styles ?
- Exemple : Je veux changer la couleur d'arrière au survol de la souris via un Style.
- Choisissez : StyledProperty.
- Cette propriété sert uniquement à stocker des données et la performance est cruciale ?
- Exemple : Afficher du texte dans une liste de 10 000 éléments.
- Choisissez : DirectProperty.
- Cette propriété est "en lecture seule" ?
- Exemple : Le pourcentage de progression calculé par un contrôle.
- Choisissez : DirectProperty (c'est le meilleur choix pour les propriétés en lecture seule).