Pregunta

La propiedad TextWrapping del TextBox tiene tres valores posibles:

  • Envolver
  • NoWrap
  • WrapWithOverflow

Me gustaría enlazar a la propiedad IsChecked de un MenuItem. Si se marca el elemento MenuItem, quiero establecer la propiedad TextWrapping de un TextBox en Wrap. Si el elemento MenuItem no está marcado, quiero establecer la propiedad TextWrapping del TextBox en NoWrap.

Para resumir, estoy intentando unir un control que tiene dos estados a dos valores de una enumeración que tiene más de dos valores.

[editar] Me gustaría lograr esto en XAML, si es posible.

[editar] Descubrí cómo hacer esto usando un IValueConverter. Tal vez hay una mejor manera de hacer esto? Esto es lo que hice:


En Window.Resources, declaré una referencia a mi ValueConverter.

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

En mi TextBox, creé el enlace a un elemento de menú e incluí el Convertidor en la declaración de enlace.

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

y el ValueConverter se ve así:

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();
        }
    }
¿Fue útil?

Solución

Si desea hacer todo esto en xaml, debe usar un Style y 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>

Otros consejos

Creo que la única y correcta la forma típica de hacer esto es usar un convertidor de valores como usted ya lo ha hecho.

A veces puede encontrar un convertidor de valor existente que ya ha creado ... o incluso mejor que Microsoft ha creado para usted. Por ejemplo, en System.Windows.Controls, Microsoft ha escrito un BooleanToVisibilityConverter ... que convierte un bool en una enumeración de Visibilidad ... convirtiendo True en Visible y False en Colapsado (y sin preocuparse por el Oculto).

Una idea es usar .NET Reflector, navegar a System.Windows.Data.IValueConverter, y luego usar la función Analizar (en particular, 'Usado por') y ver qué cosas han implementado IValueConverter ... y usted Es posible que tenga suerte si encuentra un convertidor que se adapte a su propósito.

En una nota relacionada, BooleanToVisibilityConverter es muy similar a lo que intentas hacer arriba.

Editar: Realmente me gusta la sugerencia de Todd White de diseñar el TextBox y usar un Data Trigger en el estilo. Es una muy buena idea si quieres evitar un convertidor.

Supongo que estás hablando de .NET. No creo que el enlace de datos funcione aquí porque los valores no son del mismo tipo (boolean vs enum). La solución más sencilla sería manejar el evento CheckedChanged de ese elemento del menú y ajustar el modo de ajuste del cuadro de texto en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top