2010-11-18 18 views
2

Ich habe eine Bool-Eigenschaft in meinem ViewModel namens IsConnected, und ich möchte es an einen TextBlock in meinem MainWindow binden. Anstatt den Textblock true oder false lesen zu lassen, brauche ich stattdessen Connected oder Disconnected. Verzeih mir, weil ich neu bei WPF bin. Wenn mir jemand einen Vorsprung verschaffen könnte, könnte ich es von dort aus nehmen, aber ich bin mir nicht sicher, wie ich herausfinden soll, was ich brauche.WPF-Datenbindung und -formatierung

Antwort

2

ich in der Regel nur lieber auf eine Eigenschaft die Ansicht Modell hinzufügen (Ich mag nicht wirklich Wertwandler), aber hier eine einfache Art und Weise ist, zu erreichen, was Sie versuchen, mit einem Stil zu tun:

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

bearbeiten

Beachten Sie, dass, sobald Sie zur Verwendung von Daten-Trigger verwendet, können Sie alle Arten von Änderungen an Ihrer Ansicht machen, ohne Ihre Ansicht Modell zu berühren. Zum Beispiel:

<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

Dies scheint eine bessere Lösung für das Problem zu sein. Ich denke nicht wirklich, dass ein Konverter eine so gute Idee ist. Stile scheinen besser zu passen und ich muss keine Helfereigenschaft erstellen, um Zeichenfolgenwerte zu generieren. Ich würde meine ViewModel-Daten lieber so behalten, wie sie eigentlich sein sollen. – jlafay

+0

Hat super funktioniert und vielen Dank für das Bild Beispiel, weil ich etwas ähnliches aus meiner Sicht für eine andere Eigenschaft tun möchte. – jlafay

4

Der einfachste Weg ist wahrscheinlich, einen benutzerdefinierten Konverter zu erstellen, der Ihren Bool-Wert in eine Zeichenfolge konvertiert. Suchen Sie überall nach IValueConverter und/oder 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 
} 

hinzufügen xmlns:

xmlns:converter="clr-namespace:MyProjectNameSpace" 

Add Ressource XAML (ändern, was auch immer Element benötigt)

<Window.Resources> 
    <converter:BoolToConnectedConverter x:Key="connectedConverter" /> 
</Window.Resources> 

in XAML:

<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" /> 
+0

Bitte fügen Sie weitere Details hinzu. – ocodo

+1

Die einzige Änderung, die ich vornehmen würde, ist, den Text aus einer Zeichenfolge-Ressourcendatei abzurufen.Auf diese Weise können Sie einen netten generischen 'BoolToString'-Konverter erstellen und den Parameter converter verwenden, um das Präfix des zu verwendenden Ressourcenschlüssels zu übergeben (Präfix + bool value == vollständiger Schlüssel zum Abrufen der Zeichenfolge aus der Ressource). – slugster

+0

@Slugster, stimme ich damit überein. Ich habe einen Moment darüber nachgedacht, aber aus Gründen der Einfachheit dieses Beispiel verworfen. – ThomasAndersson

0

Sie können dies tun, in zwei Möglichkeiten

1) einen Konverter

2) Ändern Sie die Funktion in der Ansichtsmodell, so dass sie die gewünschte Zeichenfolge anstelle eines Bool zurückgibt

Der einfachste Weg # 2 ist, aber wenn Sie wirklich brauchen, den Bool Wert woanders in deinem code gehst du mit # 1 (google converter und wpf)

0

Schau dir Wertewandler an.

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

In XAML:

<Window.Resources> 
    <l:BoolToConnectedConverter x:Key="boolToConnectedConverter" /> 
</Window.Resources> 
<Grid> 
    <Label Content="{Binding IsConnected, Converter={StaticResource boolToConnectedConverter}}" /> 
</Grid> 
1

Mit Ansichtsmodell, schreiben Sie zwei Eigenschaft Verpackung, und benachrichtigen Änderungen in den Immobilien.

Wenn Sie also den Wert ändern, wird die Zeichenfolgendarstellung aktualisiert und an Steuerelemente gebunden, während Sie die bool-Eigenschaft im Code weiterhin verwenden können.

public string IsConnectedStr{ 
    get{ 
    return IsConnected?"Connected":"Disconnected"; 
    } 
} 

public bool IsConnected{ 
    get{ 
    return _isConnected; 
    } 
    set{ 
    _isConnected=value; 
    PropertyChanged("IsConnected"); 
    PropertyChanged("IsConnectedStr"); 
    } 
} 
Verwandte Themen