代码之家  ›  专栏  ›  技术社区  ›  Timothy Lee Russell

如何将文本框的TextWrapping属性绑定到菜单项的IsChecked值?

  •  5
  • Timothy Lee Russell  · 技术社区  · 16 年前

    文本框的TextWrapping属性有三个可能的值:

    • 包裹
    • 诺拉普
    • 带溢出的包裹

    我想绑定到menuitem的ischecked属性。如果选中菜单项,我希望将文本框的TextWrapping属性设置为Wrapp。如果未选中菜单项,我希望将文本框的TextWrapping属性设置为Nowrap。

    综上所述,我试图将具有两个状态的控件绑定到具有两个以上值的枚举的两个值。

    [编辑] 如果可能的话,我希望在XAML中完成这项工作。

    [编辑] 我用一台IvalueConverter解决了这个问题。也许有更好的方法可以做到这一点?以下是我所做的:


    在window.resources中,我声明了对我的valueconverter的引用。

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

    在我的文本框中,我创建了对menuitem的绑定,并在binding语句中包含了转换器。

    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 回复  |  直到 16 年前
        1
  •  9
  •   Todd White    16 年前

    如果要在XAML中完成所有这些操作,则需要使用 Style 和A DataTrigger .

    <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>
    
        2
  •  0
  •   cplotts    16 年前

    我认为 唯一的权利 实现这一点的典型方法是像您已经做过的那样使用一个值转换器。

    有时,您可以找到一个您已经构建的现有值转换器…或者微软为你打造的更好的产品。例如,在system.windows.controls中,微软编写了一个booleantVisibilityConverter…它将bool转换为可见性枚举…将“真”转换为“可见”,将“假”转换为“折叠”(不担心隐藏)。

    一个想法是使用.NET Reflector,导航到system.windows.data.ivalueConverter,然后使用分析功能(尤其是“used by”),查看实现了哪些ivalueConverter…你可能会幸运地找到一个适合你目的的转换器。

    一个相关的注意事项是,booleantvisibilityconverter与你在上面所做的非常相似。

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

        3
  •  -1
  •   DCNYAM    16 年前

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

    推荐文章