6

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

  • 无包装
  • WrapWithOverflow

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

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

[编辑]如果可能,我想在 XAML 中完成此操作。

[编辑]我想出了如何使用 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();
        }
    }
4

3 回答 3

10

如果您想在 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>
于 2008-10-31T00:54:03.380 回答
0

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

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

一个想法是使用 .NET Reflector,导航到 System.Windows.Data.IValueConverter,然后使用分析功能(特别是“使用者”)并查看实现了 IValueConverter 的内容......你可能会得到很幸运能找到适合您目的的转换器。

在相关说明中, BooleanToVisibilityConverter 与您在上面尝试执行的操作非常相似。

编辑: 我真的很喜欢 Todd White 关于设置 TextBox 样式并在 Style 中使用 DataTrigger 的建议。如果您想避免使用转换器,这是一个非常好的主意。

于 2008-10-30T19:36:58.403 回答
-2

我假设您正在谈论.NET。我认为数据绑定不会在这里起作用,因为这些值的类型不同(布尔值与枚举)。最简单的解决方案是处理该菜单项的 CheckedChanged 事件并相应地调整文本框的换行模式。

于 2008-10-30T17:07:01.060 回答