2015-03-02 10 views
9

Ich habe 3 Eigenschaften, die ich versuche, an einen Textblock in XAML zu binden. Eins ist eine Bedingung und die anderen beiden sind die Zeichenfolgen, die ich abhängig von dieser Bedingung anzeigen möchte.Bedingte Textbindung XAML

<TextBlock Text="{Binding TrueText}" Style="{StaticResource styleSimpleText}" Visibility="{Binding ShowTrueText, Converter={StaticResource boolToVisibilityConverter}}"/> 
<TextBlock Text="{Binding FalseText}" Style="{StaticResource styleSimpleText}" Visibility="{Binding ShowTrueText, Converter={StaticResource invertedBoolToVisibilityConverter}}"/> 

Das funktioniert, aber jetzt müssen die Textblöcke unterschiedliche Namen haben. Kann ich das in einen TextBlock mit dem bedingten Inneren davon verwandeln?

+0

Sie müssen sie an ein Mitglied in Ihrer cs Klasse binden und OnPropertyChanged oder einige Mittel implementieren, um die Eigenschaft veränderte Ereignis zu behandeln/erhöhen: 'public string thisText {get {if (" Bedingungen) {return ‚diesen Text‘ ;} else {return "diesen anderen Text";}} // end of get} Ende von member' dann würde dein xaml-Element aussehen link this: ' 'Und einige Ressourcen auf [OnPropertyChanged.] (Https://msdn.microsoft.com/en-us/library/ms743695 (v = vs.110) .aspx) – CalebB

Antwort

27

Sie könnten das mit einem Stil erreichen und einen Datatrigger:

<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Text" Value="{Binding FalseText}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ShowTrueText}" Value="True"> 
        <Setter Property="Text" Value="{Binding TrueText}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

Eine Alternative wäre ein Multibinding mit einem Mehrwert-Wandler zu verwenden:

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource TextConverter}"> 
      <Binding Path="TrueText"/> 
      <Binding Path="FalseText"/> 
      <Binding Path="ShowTrueText"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Der Konverter würde wie folgt aussehen:

public class TextConverter : IMultiValueConverter 
{ 
    public object Convert(
     object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var trueText = (string)values[0]; 
     var falseText = (string)values[1]; 
     var showTrueText = (bool)values[2]; 
     return showTrueText ? trueText : falseText; 
    } 

    public object[] ConvertBack(
     object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
1

Ja, Sie können, wickeln Sie sie nur in einem Textblock wie folgt:

<TextBlock x:name="myTextBlock" Style="{StaticResource styleSimpleText}"> 
    <TextBlock Text="{Binding TrueText}" Visibility="{Binding ShowTrueText, Converter={StaticResource boolToVisibilityConverter}}"/> 
    <TextBlock Text="{Binding FalseText}" Visibility="{Binding ShowTrueText, Converter={StaticResource invertedBoolToVisibilityConverter}}"/> 
</TextBlock> 

Aber ich denke, die beste Antwort derjenige von Clemens (unter Verwendung eines Datatrigger) vorgesehen ist.

0

Sie können es in Ihrem Ansichtsmodell einrichten und bestimmen lassen, welcher Text angezeigt werden soll.

private static readonly string TRUETEXT = "This is the text to show when true"; 
    private static readonly string FALSETEXT = "This is the text to show when false"; 

    private bool _myBooleanProperty; 
    public bool MyBooleanProperty 
    { 
     get { return _myBooleanProperty; } 
     set 
     { 
      if (_myBooleanProperty != value) 
      { 
       _myBooleanProperty = value; 
       OnPropertyChanged("MyBooleanProperty"); 
       OnPropertyChanged("ResultText"); 
      } 
     } 
    } 

    public string ResultText 
    { 
     get 
     { 
      return MyBooleanProperty ? TRUETEXT : FALSETEXT; 
     } 
    } 

Dann binden Sie es mit nur einem einzigen Textblock. Kein Visibility Converter erforderlich.
Wenn es einen Zustand gibt, in dem kein Text angezeigt werden soll, könnten Sie das auch tun.

<TextBlock Text="{Binding ResultText}" Style="{StaticResource styleSimpleText}" /> 
1

Meiner Meinung nach ist die beste Lösung für dieses Problem wäre eine neue String-Eigenschaft in Ihrem Viewmodel sein, die entweder TrueText oder FalseText über die bedingten je zurückkehrt. Mit einer solchen Eigenschaft können Sie einfach eine einfache Bindung verwenden.

public string TheNewProperty 
{ 
    get 
    { 
    return ShowTrueText ? TrueText : FalseText; 
    } 
} 

<TextBlock Text="{Binding TheNewProperty}" Style="{StaticResource styleSimpleText}"/> 
1

Die Art, wie wir diese Art von Sache für MVVM machen, besteht darin, eine Eigenschaft in Ihrem Viewmodel dafür zu erstellen. Dies ermöglicht es Ihnen, Unit-Tests für Ihre Bedingung auf dem Viewmodel zu haben.

Die Eigenschaft in Ihrem Ansichtsmodell ist der Zeichenfolgenwert, an den der TextBlock gebunden ist. Das Ansichtsmodell bestimmt irgendwann den Wert dieser Zeichenfolge basierend auf der benötigten bedingten Logik.