2008-10-30 19 views
5

La propiedad TextWrapping del cuadro de texto tiene tres valores posibles:¿Cómo se vincula la propiedad TextWrapping de un TextBox con el valor IsChecked de un elemento de menú?

  • Wrap
  • nowrap
  • WrapWithOverflow

me gustaría unirse a la propiedad de un IsChecked Menultem. 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 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.

[edit] 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, he declarado una referencia a mi ValueConverter.

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

En mi cuadro de texto, que creó la unión a un Menultem e incluyó el Conversor en la declaración de unión.

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

y la ValueConverter se parece a esto:

+0

Estoy tratando de hacer lo mismo en SL 4, pero mi convertidor nunca se llama. El xaml es idéntico al suyo ... – Number8

Respuesta

9

Si desea hacer todo esto en xaml necesita 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> 
+0

¿Cómo sabe TextBox cambiar a NoWrap cuando IsChecked es falso? Funciona, pero no entiendo por qué. ¿Es porque TextWrapping en un TextBox tiene un valor predeterminado o algo más? –

+1

Sí, cuando ya no se usa un disparador, vuelve al valor predeterminado. –

+0

¿Cómo se determina cuál es el valor predeterminado para una propiedad dada de un objeto, además de la experimentación en el depurador? En otras palabras, ¿cómo sabría no hacer DataTrigger, "IsChecked = false" y Setter, "TextWrapping = NoWrap", suponiendo que volvería a "Wrap"? Gracias! –

-1

Asumo que está hablando .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 de menú y ajustar el modo de ajuste del cuadro de texto en consecuencia.

+0

Incorrecto. Se puede hacer en xaml. – Will

0

creo que la única y derecha la forma típica de hacer esto es utilizar un convertidor de valores al igual que ya lo han hecho.

A veces puede encontrar un convertidor de valores 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, vaya a la System.Windows.Data.IValueConverter, y luego utilizar la función Analizar (en particular, 'utilizado por') y ver qué cosas han implementado IValueConverter ... y es posible que tenga 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.

Editar: me gusta mucho la sugerencia de Todd White de peinar el cuadro de texto y el uso de un DataTrigger en el estilo. Es una muy buena idea si quieres evitar un convertidor.

Cuestiones relacionadas