J'ai une propriété bool dans mon ViewModel appelé IsConnected
et je voudrais le lier à un TextBlock dans ma MainWindow. Plutôt que d'avoir le bloc de texte lu true
ou false
j'ai besoin de dire Connected
ou Disconnected
à la place. Pardonnez-moi parce que je suis nouveau à WPF. Si quelqu'un peut me donner une longueur d'avance, je peux le prendre à partir de là mais je ne suis pas sûr de savoir ce dont j'ai besoin.Liaison de données WPF et formatage
Répondre
Je préfère généralement juste ajouter une propriété au modèle de vue (je n'aime vraiment les convertisseurs de valeur), mais voici un moyen simple d'accomplir ce que vous essayez de faire en utilisant un style:
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="Connected"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="False">
<Setter Property="Text" Value="Disconnected"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Modifier
Notez qu'une fois que vous vous habituez à l'aide de déclencheurs de données, vous pouvez faire toutes sortes de modifications à votre point de vue sans toucher votre modèle de vue. Par exemple:
<StackPanel>
<Image Source="images\connected.png">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Image Source="images\disconnected.png">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</StackPanel>
Le moyen le plus simple est probablement de créer un convertisseur personnalisé qui convertit votre valeur booléenne en une chaîne. Recherche n'importe où pour IValueConverter et/ou WPF.
public class BoolToConnectedConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if((bool)value)
return "Connected";
else
return "Disconnected";
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
ajouter xmlns:
xmlns:converter="clr-namespace:MyProjectNameSpace"
Ajouter une ressource à XAML (changement à tout élément nécessaire)
<Window.Resources>
<converter:BoolToConnectedConverter x:Key="connectedConverter" />
</Window.Resources>
en XAML:
<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" />
Veuillez ajouter plus de détails. – ocodo
Le seul changement que je ferais à ceci est de récupérer le texte d'un fichier de ressources de chaîne.De cette façon, vous pouvez en faire un bon convertisseur générique 'BoolToString', et utiliser le paramètre convertisseur pour passer dans le préfixe de la clé de ressource à utiliser (préfixe + valeur booléenne == clé complète requise pour extraire la chaîne de la ressource). – slugster
@slugster, je suis d'accord avec ça. Pensé à ce sujet pendant un moment, mais l'a écarté par souci de simplicité pour cet échantillon. – ThomasAndersson
Vous pouvez le faire en deux façons
1) Ecrire un convertisseur
2) Changer la fonction dans le ViewModel pour qu'il retourne la chaîne désirée au lieu d'un bool
Le plus simple est # 2, mais si vous avez vraiment besoin de la valeur bool quelque part dans votre code vous allez aveC# 1 (convertisseur de google et wpf)
Jetez un coup d'oeil aux convertisseurs de valeur.
http://www.wpftutorial.net/ValueConverters.html
public class BoolToConnectedConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var isConnected = (bool)value;
return isConnected ? "Connected" : "Disconnected";
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException("Not required for read-only values");
}
}
Dans votre XAML:
<Window.Resources>
<l:BoolToConnectedConverter x:Key="boolToConnectedConverter" />
</Window.Resources>
<Grid>
<Label Content="{Binding IsConnected, Converter={StaticResource boolToConnectedConverter}}" />
</Grid>
En utilisant ViewModel, vous écrivez deux wrap de la propriété, et notifieront les modifications de la propriété réelle. Ainsi, chaque fois que la valeur est modifiée, la représentation sous forme de chaîne se met à jour et se lie aux contrôles, alors que vous pouvez toujours utiliser la propriété bool dans le code.
public string IsConnectedStr{
get{
return IsConnected?"Connected":"Disconnected";
}
}
public bool IsConnected{
get{
return _isConnected;
}
set{
_isConnected=value;
PropertyChanged("IsConnected");
PropertyChanged("IsConnectedStr");
}
}
- 1. données WPF de liaison
- 2. Liaison de données WPF
- 3. WPF, WVVM, Liaison de données et ResourceDictionaries
- 4. Liaison de données et temporisateur dans WPF?
- 5. Collections WPF et liaison de données
- 6. WPF TabControl Liaison de données
- 7. Liaison de données dans WPF
- 8. Liaison de données avec WPF
- 9. WPF et le formatage de chaîne
- 10. WPF: liaison et commandes
- 11. Notification d'erreur de liaison de liaison de données WPF
- 12. Wpf Liaison de données avec IMultiValueConverter et erreurs de moulage
- 13. Modèle et référentiel de liaison de données d'arbre WPF
- 14. Liaison de données de droite dans WPF
- 15. WPF Listbox - problème de liaison de données
- 16. Aide de liaison de données WPF ComboBox?
- 17. Problème de liaison de données WPF (MVVM)
- 18. Limitation de liaison de données WPF TwoWay
- 19. Liaison de données avec WPF et MVVM/Model-View-ViewModel
- 20. Liaison de données WPF et styles avec MVVM
- 21. Liaison de données WPF IsEnabled Propriété
- 22. WPF Multiline ToolTip avec liaison de données
- 23. Liaison de données dans WPF (C#)
- 24. Liaison de données WPF dans XAML
- 25. WPF a perdu la liaison de données
- 26. wpf liaison de données pour novice
- 27. Liaison de données IronRuby et XAML
- 28. Liaison de données WPF avec le constructeur
- 29. Liaison de données WPF avec haute fréquence
- 30. WPF Liaison de données Erreur dans ListBox
Cela semble être une meilleure solution au problème. Je ne pense pas vraiment qu'un convertisseur est une bonne idée. Les styles semblent mieux adaptés et je n'ai pas besoin de créer une propriété d'aide pour générer des valeurs de chaîne. Je préfère conserver mes données ViewModel sous la forme qu'elles sont censées contenir. – jlafay
J'ai bien travaillé et je vous remercie pour l'exemple de l'image parce que je veux faire quelque chose de similaire à mon avis pour une autre propriété. – jlafay