如何将TextBox的TextWrapping属性绑定到MenuItem的IsChecked值?

Tim*_*ell 5 wpf checkbox enums binding word-wrap

TextBox的TextWrapping属性有三个可能的值:

  • 包裹
  • NoWrap的
  • WrapWithOverflow

我想绑定到MenuItem的IsChecked属性.如果选中了MenuItem,我想将TextBox的TextWrapping属性设置为Wrap.如果未选中MenuItem,我想将TextBox的TextWrapping属性设置为NoWrap.

总而言之,我试图将具有两个状态的控件绑定到具有两个以上值的枚举的两个值.

[edit]我想在XAML中完成这个,如果可能的话.

[edit]我想出了如何使用IValueConverter来做到这一点.也许有更好的方法来做到这一点?这是我做的:


在Window.Resources中,我声明了对ValueConverter的引用.

<local:Boolean2TextWrapping x:Key="Boolean2TextWrapping" />
Run Code Online (Sandbox Code Playgroud)

在我的TextBox中,我创建了与MenuItem的绑定,并在绑定语句中包含了Converter.

TextWrapping="{Binding ElementName=MenuItemWordWrap, Path=IsChecked, Converter={StaticResource Boolean2TextWrapping}}"
Run Code Online (Sandbox Code Playgroud)

而ValueConverter看起来像这样:

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Tod*_*ite 9

如果你想在xaml中完成所有这一切,你需要使用StyleDataTrigger.

<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>
Run Code Online (Sandbox Code Playgroud)