2010-11-18 6 views
2

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

2

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> 
+0

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

+0

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

4

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}" /> 
+0

Veuillez ajouter plus de détails. – ocodo

+1

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

+0

@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

0

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)

0

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> 
1

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"); 
    } 
}