Domanda

La proprietà TextWrapping di TextBox ha tre possibili valori:

  • Scorrimento
  • NoWrap
  • WrapWithOverflow

Vorrei legare alla proprietà IsChecked di un MenuItem. Se il MenuItem è selezionato, voglio impostare la proprietà TextWrapping di una TextBox su Wrap. Se MenuItem non è selezionato, desidero impostare la proprietà TextWrapping di TextBox su NoWrap.

Per riassumere, sto cercando di associare un controllo che ha due stati a due valori di un elenco che ha più di due valori.

[modifica] Vorrei farlo in XAML, se possibile.

[modifica] Ho capito come fare usando un IValueConverter. Forse c'è un modo migliore per farlo? Ecco cosa ho fatto:


In Window.Resources, ho dichiarato un riferimento al mio ValueConverter.

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

Nel mio TextBox, ho creato l'associazione a MenuItem e incluso il convertitore nell'istruzione di associazione.

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

e ValueConverter è simile al seguente:

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();
        }
    }
È stato utile?

Soluzione

Se vuoi fare tutto questo in xaml devi usare un Stile e un 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>

Altri suggerimenti

Penso che l'unico e giusto il modo tipico per farlo sia usare un convertitore di valore come hai già fatto.

A volte puoi trovare un convertitore di valore esistente che hai già creato ... o ancora meglio che Microsoft ha creato per te. Ad esempio, in System.Windows.Controls, Microsoft ha scritto un BooleanToVisibilityConverter ... che converte un bool in un enum di visibilità ... convertendo True in Visible e False in Collapsed (e non preoccuparsi di Hidden).

Un'idea è quella di utilizzare .NET Reflector, accedere a System.Windows.Data.IValueConverter, quindi utilizzare la funzione Analizza (in particolare "Usato da") e vedere quali cose hanno implementato IValueConverter ... e tu potrebbe essere fortunato trovare un convertitore adatto al tuo scopo.

In una nota correlata, BooleanToVisibilityConverter è molto simile a quello che stai cercando di fare sopra.

Modifica Mi piace molto il suggerimento di Todd White di dare uno stile al TextBox e usare un DataTrigger nello stile. È un'ottima idea se vuoi evitare un convertitore.

Presumo che tu stia parlando di .NET. Non penso che il databinding funzionerà qui perché i valori non sono dello stesso tipo (booleano vs enum). La soluzione più semplice sarebbe quella di gestire l'evento CheckedChanged di quella voce di menu e regolare di conseguenza la modalità di avvolgimento della casella di testo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top