Comment liez-vous la propriété TextWrapping d'un TextBox à la valeur IsChecked d'un MenuItem?

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

Question

La propriété TextWrapping de la zone de texte a trois valeurs possibles:

  • Envelopper
  • NoWrap
  • WrapWithOverflow

Je voudrais créer un lien vers la propriété IsChecked d'un MenuItem. Si l'option MenuItem est cochée, je souhaite définir la propriété TextWrapping d'un TextBox sur Wrap. Si l'option MenuItem n'est pas cochée, je souhaite définir la propriété TextWrapping de la zone de texte sur NoWrap.

En résumé, j'essaie de lier un contrôle comportant deux états à deux valeurs d'une énumération comportant plus de deux valeurs.

[edit] Je voudrais accomplir cela si possible en XAML.

[edit] J'ai compris comment procéder à l'aide d'un convertisseur IValue. Peut-être y a-t-il une meilleure façon de faire cela? Voici ce que j'ai fait:

Dans Window.Resources, j'ai déclaré une référence à mon ValueConverter.

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

Dans ma zone de texte, j'ai créé la liaison à un MenuItem et inclus le convertisseur dans l'instruction de liaison.

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

et le ValueConverter ressemble à ceci:

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();
        }
    }
Était-ce utile?

La solution

Si vous voulez faire tout cela en xaml, vous devez utiliser un Style et 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>

Autres conseils

Je pense que le seul et correct moyen typique consiste à utiliser un convertisseur de valeur comme vous l'avez déjà fait.

Parfois, vous pouvez trouver un convertisseur de valeur existant que vous avez déjà construit ... ou même meilleur que Microsoft a construit pour vous. Par exemple, dans System.Windows.Controls, Microsoft a écrit un BooleanToVisibilityConverter ... qui convertit une valeur booléenne en une énumération Visibility ... convertissant True en visible et False en Collapsed (sans se soucier de Caché).

Une idée est d’utiliser .NET Reflector, d’accéder à System.Windows.Data.IValueConverter, puis d’utiliser la fonction Analyser (en particulier "Utilisé par") et de voir ce qui a été mis en œuvre par IValueConverter ... et vous-même. juste avoir la chance de trouver un convertisseur qui vous convient.

Sur une note connexe, BooleanToVisibilityConverter est très similaire à ce que vous essayez de faire ci-dessus.

Modifier: J'aime beaucoup la suggestion de Todd White de styler la zone de texte et d'utiliser un DataTrigger dans le style. C'est une très bonne idée si vous voulez éviter un convertisseur.

Je suppose que vous parlez de .NET. Je ne pense pas que la liaison de données fonctionnera ici car les valeurs ne sont pas du même type (boolean vs enum). La solution la plus simple consiste à gérer l'événement CheckedChanged de cet élément de menu et à ajuster le mode d'habillage de la zone de texte en conséquence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top