wpf - ¿Cómo se vincula la propiedad TextWrapping de un TextBox con el valor IsChecked de un MenuItem?
binding enums (3)
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 fácil sería manejar el evento CheckedChanged de ese elemento del menú y ajustar el modo de ajuste del cuadro de texto en consecuencia.
La propiedad TextWrapping del TextBox tiene tres valores posibles:
- Envolver
- NoWrap
- WrapWithOverflow
Me gustaría enlazar a la propiedad IsChecked de un MenuItem. Si MenuItem está marcado, quiero establecer la propiedad TextWrapping de un TextBox en Ajustar. Si MenuItem no está marcado, quiero establecer la propiedad TextWrapping del TextBox en NoWrap.
En resumen, estoy intentando vincular un control que tiene dos estados con dos valores de una enumeración que tiene más de dos valores.
[edit] Me gustaría lograr esto en XAML, si es posible.
[edit] Descubrí cómo hacer esto usando un IValueConverter. Tal vez hay una mejor manera de hacer esto? Aquí esta lo que hice:
En Window.Resources, he declarado 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 vinculante.
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();
}
}
Si desea hacer todo esto en xaml, necesita usar un estilo 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>
Creo que la única y correcta forma de hacerlo es usar un convertidor de valor como ya lo hiciste.
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 BooleanToVisibilityConverter ... que convierte un bool en una enumeración de Visibilidad ... convirtiendo True en Visible y False en Colapsada (y sin preocuparse por Hidden).
Una idea es utilizar .NET Reflector, navegar a System.Windows.Data.IValueConverter, y luego usar la función Analyze (en particular, ''Used by'') y ver qué cosas han implementado IValueConverter ... y es posible que suerte de encontrar un convertidor que se adapte a su propósito.
En una nota relacionada, BooleanToVisibilityConverter es muy similar a lo que intenta hacer arriba.
Edición: realmente me gusta la sugerencia de Todd White de diseñar el TextBox y usar un DataTrigger en Style. Es una muy buena idea si quieres evitar un convertidor.