2008-10-30 24 views
5

Die TextWrapping Eigenschaft des TextBox hat drei mögliche Werte:Wie binden Sie die TextWrapping-Eigenschaft eines TextBox an den IsChecked-Wert eines MenuItem?

  • Wrap
  • NoWrap
  • WrapWithOverflow

ich zum IsChecked Eigenschaft eines MenuItem binden möchten. Wenn das MenuItem aktiviert ist, möchte ich die TextWrapping -Eigenschaft eines TextBox auf Wrap festlegen. Wenn das MenuItem nicht aktiviert ist, möchte ich die TextWrapping-Eigenschaft des TextBox auf NoWrap festlegen.

Zusammenfassend versuche ich, ein Steuerelement, das zwei Zustände hat, an zwei Werte einer Aufzählung zu binden, die mehr als zwei Werte aufweist.

[bearbeiten] Ich möchte dies in XAML, wenn möglich, erreichen.

[bearbeiten] Ich habe herausgefunden, wie dies mit einem IValueConverter zu tun. Vielleicht gibt es einen besseren Weg, dies zu tun? Hier ist, was ich getan habe:


In Window.Resources, erklärte ich einen Verweis auf meine Valueconverter.

In meiner TextBox habe ich die Bindung an ein MenuItem erstellt und den Konverter in die bindende Anweisung aufgenommen.

TextWrapping="{Binding ElementName=MenuItemWordWrap, Path=IsChecked, Converter={StaticResource Boolean2TextWrapping}}" 

und die Valueconverter sieht wie folgt aus:

+0

Ich versuche, das gleiche in SL 4 zu tun, aber mein Konverter wird nie aufgerufen. Die XAML ist identisch mit deiner ... – Number8

Antwort

9

Wenn Sie dies alles in XAML tun möchten, müssen Sie eine Style und eine DataTrigger verwenden.

<StackPanel> 
    <CheckBox x:Name="WordWrap">Word Wrap</CheckBox> 
    <TextBlock Width="50"> 
     Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin lacinia nibh non augue. Pellentesque pretium neque et neque auctor adipiscing. 

     <TextBlock.Style> 
      <Style TargetType="{x:Type TextBlock}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsChecked, ElementName=WordWrap}" Value="True"> 
         <Setter Property="TextWrapping" Value="Wrap" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</StackPanel> 
+0

Wie kann die TextBox zu NoWrap wechseln, wenn IsChecked False ist? Es funktioniert - aber ich verstehe nicht warum. Liegt es daran, dass TextWrapping für eine TextBox einen Standard oder etwas anderes hat? –

+1

Ja, wenn ein Trigger nicht mehr verwendet wird, fällt er auf den Standardwert zurück. –

+0

Wie bestimmen Sie, was der Standardwert für eine bestimmte Eigenschaft eines Objekts ist, abgesehen von Experimenten im Debugger? Mit anderen Worten, wie würde ich wissen, nicht den DataTrigger zu machen, "IsChecked = false" und den Setter, "TextWrapping = NoWrap" unter der Annahme, dass es auf "Wrap" fallen würde? Danke! –

-1

Ich nehme an, Sie über .NET sprechen. Ich glaube nicht, dass Databinding hier funktioniert, weil die Werte nicht vom selben Typ sind (Boolean vs enum). Die einfachste Lösung wäre, das CheckedChanged-Ereignis dieses Menüelements zu behandeln und den Umbruchmodus des Textfelds entsprechend anzupassen.

+0

Falsch. Es kann in XAML getan werden. – Will

0

Ich denke, dass der einzige und richtige der typische Weg, dies zu tun ist, verwenden Sie einen Wertkonverter wie Sie bereits getan haben.

Manchmal können Sie einen vorhandenen Wertkonverter finden, den Sie bereits erstellt haben ... oder noch besser, den Microsoft für Sie erstellt hat. In System.Windows.Controls hat Microsoft beispielsweise einen BooleanToVisibilityConverter ... geschrieben, der ein bool in eine Visibility-Enum konvertiert ..., die True in Sichtbar und False in Collapsed konvertiert (und sich nicht um Hidden kümmert).

Eine Idee ist die Verwendung von .NET Reflector, navigieren Sie zum System.Windows.Data.IValueConverter, und verwenden Sie dann die Funktion "Analysieren" (insbesondere "Used by") und sehen, welche Dinge IValueConverter ... und implementiert haben Sie könnten nur Glück haben, einen Konverter zu finden, der Ihrem Zweck entspricht.

Zu einem verwandten Hinweis, BooleanToVisibilityConverter ist sehr ähnlich zu dem, was Sie versuchen, oben zu tun.

Bearbeiten: Ich mag Todd White Vorschlag der Styling der TextBox und die Verwendung eines DataTrigger im Stil. Es ist eine sehr gute Idee, wenn Sie einen Konverter vermeiden möchten.