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

Wpf 如何将TextBox的TextWrapping属性绑定到MenuItem的IsChecked值?,wpf,binding,enums,checkbox,word-wrap,Wpf,Binding,Enums,Checkbox,Word Wrap,TextBox的TextWrapping属性有三个可能的值: 包裹 诺拉普 幽灵溢出 我想绑定到MenuItem的IsChecked属性。如果选中MenuItem,我想将TextBox的TextWrapping属性设置为Wrap。如果未选中MenuItem,我想将TextBox的TextWrapping属性设置为NoWrap 总之,我试图将具有两个状态的控件绑定到具有两个以上值的枚举的两个值 [编辑]如果可能的话,我想用XAML完成这项工作 [编辑]我找到了使用IValueConverter

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

  • 包裹
  • 诺拉普
  • 幽灵溢出
我想绑定到MenuItem的IsChecked属性。如果选中MenuItem,我想将TextBox的TextWrapping属性设置为Wrap。如果未选中MenuItem,我想将TextBox的TextWrapping属性设置为NoWrap

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

[编辑]如果可能的话,我想用XAML完成这项工作

[编辑]我找到了使用IValueConverter来实现这一点的方法。也许有更好的方法可以做到这一点?以下是我所做的:


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

<local:Boolean2TextWrapping x:Key="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();
        }
    }

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

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

有时,您可以找到一个已经构建的现有值转换器。。。甚至比微软为你打造的更好。例如,在System.Windows.Controls中,Microsoft编写了BooleantVisibilityConverter。。。将布尔值转换为可见性枚举。。。将True转换为可见,将False转换为折叠(不必担心隐藏)

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

与此相关的是,BooleantVisibilityConverter与您在上面尝试的操作非常相似

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

如果您想在xaml中完成这一切,您需要使用和

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

换行
Lorem ipsum dolor sit amet,是一位杰出的领导者。在拉齐尼亚尼布非奥古斯。佩伦特斯式的拍卖行和拍卖行。

当IsChecked为False时,文本框如何知道切换到NoWrap?这是可行的,但我不明白为什么。这是因为TextBox上的TextWrapping具有默认值还是其他原因?是的,当触发器不再使用时,它会返回到默认值。除了在调试器中进行实验外,如何确定对象给定属性的默认值?换句话说,我怎么知道不让DataTrigger“IsChecked=false”和Setter“TextWrapping=NoWrap”假设返回到“wrapp”呢?谢谢这就是MSDN文档的用武之地。对于TextBlock.TextWrapping,我在这里查找了它。在那一页上写着“默认为TextWrapping.NoWrap”,我喜欢它。如果可能的话,我总是尽量避免使用转换器。我以前从未使用过这样的数据触发器。有用的技巧。我尝试在SL 4中做同样的事情,但我的转换器从未被调用。xaml与您的完全相同。。。
<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>