【问题标题】:How do you bind the TextWrapping property of a TextBox to the IsChecked value of a MenuItem?如何将 TextBox 的 TextWrapping 属性绑定到 MenuItem 的 IsChecked 值?
【发布时间】:2010-09-20 00:48:12
【问题描述】:

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

  • 换行
  • 无包装
  • WrapWithOverflow

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

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

[edit]如果可能,我想在 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();
        }
    }

【问题讨论】:

  • 我正在尝试在 SL 4 中做同样的事情,但我的转换器从未被调用。 xaml 与您的相同...

标签: wpf binding enums checkbox word-wrap


【解决方案1】:

如果您想在 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>

【讨论】:

  • 当 IsChecked 为 False 时,TextBox 如何知道切换到 NoWrap?它有效——但我不明白为什么。是因为 TextBox 上的 TextWrapping 有默认值还是其他什么?
  • 是的,当不再使用触发器时,它会回退到默认值。
  • 除了在调试器中进行试验外,您如何确定对象的给定属性的默认值是多少?换句话说,我怎么知道不让 DataTrigger、“IsChecked = false”和 Setter、“TextWrapping = NoWrap”假设它会回退到“Wrap”?谢谢!
  • 这是 MSDN 文档的用武之地。在 TextBlock.TextWrapping 的情况下,我在这里查找了它msdn.microsoft.com/en-us/library/…。在该页面上显示“默认为 TextWrapping.NoWrap”
  • 我喜欢。如果可能,我总是尽量避免使用转换器。我以前从未使用过这样的 DataTrigger。有用的技巧。
【解决方案2】:

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

有时您可以找到您已经构建的现有价值转换器……甚至是 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 的建议。如果您想避免使用转换器,这是一个非常好的主意。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2012-11-15
      • 1970-01-01
      • 2011-02-24
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多