Frage

Die TextWrapping Eigenschaft des TextBox hat drei mögliche Werte:

  • Wrap
  • NoWrap
  • WrapWithOverflow

Ich möchte die IsChecked Eigenschaft eines MenuItem binden. Wenn die MenuItem aktiviert ist, möchte ich die TextWrapping Eigenschaft eines TextBox festlegen zu wickeln. Wenn die MenuItem nicht aktiviert ist, möchte ich die TextWrapping Eigenschaft des TextBox NoWrap setzen.

Um es zusammenzufassen, ich versuche, eine Kontrolle zu binden, die zwei Zustände auf zwei Werte einer Aufzählung hat, die mehr als zwei Werte hat.

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

[Bearbeiten] Ich habe herausgefunden, wie dies zu tun, um eine IValueConverter verwenden. 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.

<local:Boolean2TextWrapping x:Key="Boolean2TextWrapping" />

In meinem TextBox, habe ich die Bindung an ein MenuItem und enthalten den Konverter in der verbindliche Aussage.

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

und die Valueconverter sieht wie folgt aus:

public class Boolean2TextWrapping : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo)
        {
            if (((bool)value) == false)
            {
                return TextWrapping.NoWrap;
            }
            return TextWrapping.Wrap;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
War es hilfreich?

Lösung

Wenn Sie dies alles in XAML tun wollen, müssen Sie ein Datatrigger .

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

Andere Tipps

Ich denke, dass die einzig und richtig die typische Art und Weise, dies zu tun ist, einen Wert Konverter zu verwenden, wie Sie bereits getan haben.

Manchmal kann man einen vorhandenen Wertkonverter, die Sie bereits gebaut haben ... oder noch besser, dass Microsoft für Sie gebaut hat. Zum Beispiel in System.Windows.Controls hat Microsoft eine BooleanToVisibilityConverter geschrieben ..., die einen Bool in eine Sichtbarkeit Enum konvertiert ... Umwandlung Getreu Sichtbare und False Komprimiert (und keine Sorgen über Versteckt).

Eine Idee ist, .NET Reflector zu verwenden, navigieren Sie zu dem System.Windows.Data.IValueConverter, und dann die Funktion Analyse verwenden (insbesondere ‚Wird von‘) und sehen, welche Dinge haben IValueConverter umgesetzt ... und Sie nur könnte Glück haben, einen Konverter zu finden, die Ihren Zweck geeignet ist.

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

Edit: Ich mag Todd White Vorschlag der Textbox Styling und einen Datatrigger im Stil verwenden. Es ist eine sehr gute Idee, wenn Sie einen Konverter zu vermeiden.

Ich nehme an, Sie über .NET sprechen. Ich glaube nicht, Datenbindung wird hier arbeiten, weil die Werte nicht vom gleichen Typ (boolean vs Enum) sind. Die einfachste Lösung wäre es, das CheckedChanged Ereignis dieses Menüpunktes zu handhaben und die Wrapmode der Textbox entsprechend anpassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top