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

时间:2008-10-30 16:32:46

标签: wpf binding enums checkbox textwrapping

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" />

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

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

并且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();
        }
    }

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

我认为唯一且正确这样做的典型方法是使用像您已经完成的值转换器。

有时您可以找到已经构建的现有值转换器......或者甚至是Microsoft为您构建的更好的转换器。例如,在System.Windows.Controls中,Microsoft编写了一个BooleanToVisibilityConverter ...,它将bool转换为Visibility枚举...将True转换为Visible,将False转换为Collapsed(并且不用担心隐藏)。

一个想法是使用.NET Reflector,导航到System.Windows.Data.IValueConverter,然后使用Analyze功能(特别是'Used by'),看看有什么东西实现了IValueConverter ...而你可能很幸运能找到适合您目的的转换器。

在相关的说明中,BooleanToVisibilityConverter与您在上面尝试的内容非常相似。

修改 我非常喜欢Todd White关于TextBox样式和在Style中使用DataTrigger的建议。如果你想避免转换器,这是一个非常好的主意。

答案 2 :(得分:-1)

我假设你在谈论.NET。我不认为数据绑定在这里会起作用,因为值的类型不同(boolean vs enum)。最简单的解决方案是处理该菜单项的CheckedChanged事件并相应地调整文本框的包装模式。