Como você vincular a propriedade TextWrapping de uma caixa de texto para o valor IsChecked de um MenuItem?

StackOverflow https://stackoverflow.com/questions/250840

Pergunta

A propriedade TextWrapping do TextBox tem três valores possíveis:

  • Enrole
  • NoWrap
  • WrapWithOverflow

Eu gostaria de associar à propriedade IsChecked de um MenuItem. Se o MenuItem é verificado, eu quero definir a propriedade TextWrapping de uma caixa de texto para Wrap. Se o MenuItem não está marcada, eu quero definir a propriedade TextWrapping da caixa de texto para NoWrap.

Para resumir, eu estou tentando ligar um controle que tem dois estados para dois valores de uma enumeração que tem mais de dois valores.

[editar] eu gostaria de fazer isso em XAML, se possível.

[editar] eu descobri como fazer isso usando um IValueConverter. Talvez haja uma maneira melhor de fazer isso? Aqui está o que eu fiz:


Em Window.Resources, declarei uma referência ao meu ValueConverter.

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

Na minha TextBox, eu criei a ligação a um MenuItem e incluiu o conversor na demonstração de ligação.

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

e os olhares ValueConverter como este:

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

Solução

Se você quiser fazer isso tudo em xaml você precisa usar um Estilo e uma 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>

Outras dicas

Eu acho que o único e direita a maneira típica de fazer isso é usar um conversor de valor como você já fez.

Às vezes você pode encontrar um conversor de valor existente que você tem construído já ... ou ainda melhor que a Microsoft construiu para você. Por exemplo, em System.Windows.Controls, Microsoft escreveu um BooleanToVisibilityConverter ... que converte um bool em uma Visibilidade enum ... convertendo Fiel ao visível e False para Collapsed (e não se preocupar com Oculto).

Uma idéia é usar NET Reflector, navegue até o System.Windows.Data.IValueConverter, e depois usar o recurso Analisar (em particular, 'Usado por') e ver o que as coisas têm implementado IValueConverter ... e você só pode ter a sorte de encontrar um conversor que se adapta ao seu propósito.

Em uma nota relacionada, BooleanToVisibilityConverter é muito semelhante ao que você está tentando fazer acima.

Editar: Eu realmente gosto sugestão de Todd White de estilo de texto e usando um DataTrigger no estilo. É uma idéia muito boa se você quer evitar um conversor.

Eu suponho que você está falando sobre .NET. Eu não acho que a ligação de dados irá trabalhar aqui porque os valores não são do mesmo tipo (boolean vs enum). A solução mais fácil seria para manipular o evento CheckedChanged desse item de menu e ajuste o modo envoltório da caixa de texto em conformidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top