Existe-t-il un moyen de lier le soulignement ?? J'essaie d'obtenir les résultats suivants:
J'ai VievModel avec une propriété booléenne:
public bool HomeButtonUnderline {get; ensemble; } = false;
Je voudrais alors contrôler cette propriété dans la fonction suivante:
<Button> <TextBlock TextDecorations="Underline"> </Button>
Je pourrais alors utiliser ce contrôle en XAML:
<Button>
<TextBlock Command="{Binding HomeNavCommand}" Underline="{Binding HomeButtonUnderline}"/>
</Button>
Le problème est qu'il n'y a pas de propriété 'Underline', à la place elle est gérée par 'TextDecorations':
public void Home() {
//CurrentPage = ApplicationPage.Home;
//HomeButtonForeground = new SolidColorBrush(Colors.White);
HomeButtonUnderline = true;
SettingsButtonUnderline = false;
}
Il existe donc un moyen de contrôler le soulignement en utilisant MVVM ou même sans ??
3 Réponses :
Utilisez un convertisseur pour convertir vos types de modèle (dans ce cas, un booléen) en types d'interface utilisateur (dans ce cas, un TextDecoration).
<Button Command="{Binding HomeNavCommand}">
<Button.Resources>
<local:UnderlineConverter x:Key="UnderlineConverter" />
</Button.Resources>
<TextBlock TextDecorations="{Binding HomeButtonUnderline, Converter={StaticResource UnderlineConverter}"/>
</Button>
Et puis utilisez-le dans votre liaison (après avoir créé une ressource dans votre fenêtre, UserControl App.xaml ou partout où vous pensez être le bon endroit; pour cet exemple, je le mets simplement dans les ressources du bouton)
public class UnderlineConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
return System.Convert.ToBoolean(value) ? TextDecorations.Underline : null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
p>
Vous pouvez utiliser un DataTrigger dans un style pour le TextBlock:
<Button Command="{Binding HomeNavCommand}">
<TextBlock Text="Home">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding HomeButtonUnderline}" Value="True">
<Setter Property="TextDecorations" Value="Underline"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Button>
Merci d'avoir répondu. La solution fonctionne, mais je préfère le convertisseur de valeur pour un code un peu plus propre.
@Yoghurt - En fait, vous êtes légèrement en arrière :). Les DataTriggers sont la voie à suivre. C'est juste une chose ponctuelle. Qu'allez-vous faire lorsque vous devez définir 20 propriétés sur un objet? Créer 20 convertisseurs personnalisés? Heck non!
@SledgeHammer - mais que faire si vous souhaitez lier la propriété de soulignement pour 20 blocs de texte différents, chacun à des propriétés différentes? Ensuite, vous aurez besoin de 20 DataTriggers ou d'un seul convertisseur. Les deux méthodes sont utiles dans la bonne situation - c'est "chevaux pour cours".
@SledgeHammer maintenant que j'ai enfin assez de réputation pour commenter: je ne créerais pas 20 convertisseurs. J'essaierais de créer un convertisseur suffisamment générique (comme BoolToValueConverter) et de créer simplement celui-ci en XAML avec les valeurs dont j'ai besoin (dans ce cas, TextDecorations.Underline pour true et null pour false). Cela ne fonctionne pas toujours, mais c'est souvent le cas. Ce que j'aime à propos des convertisseurs par rapport aux DataTriggers, c'est que les convertisseurs n'encombrent pas autant le XAML (c'est subjectif, je sais). Si je dois définir 20 propriétés en réponse à 1 propriété dans le ViewModel, j'utiliserais certainement un DataTrigger.
Bien sûr, une autre façon de gérer cela est que votre modèle de vue soit le bon type pour la vue:
public TextDecorationCollection HomeButtonUnderline { get; set; }
HomeButtonUnderline est déjà orienté GUI, il y a donc probablement du code dans votre viewmodel qui attribue une valeur du modèle, donc il pourrait aussi bien convertir de bool en TextDecorations.Underline .
Cette méthode conserve toute la logique dans le même fichier, contrairement à un convertisseur, bien qu'un convertisseur soit plus réutilisable. Il a également l'avantage d'être facilement testable unitaire (contrairement à un déclencheur de données).