2008-10-30 81 views
5

TextBox的TextWrapping属性有三种可能的值:如何将TextBox的TextWrapping属性绑定到MenuItem的IsChecked值?

  • NoWrap的
  • WrapWithOverflow

我想绑定到一个菜单项的财产器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看起来是这样的:

+0

我想在SL 4中做同样的事情,但我的转换器永远不会被调用。 xaml与您的相同... – Number8 2011-03-18 13:54:04

回答

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> 
+0

当IsChecked为False时,TextBox如何知道切换到NoWrap?它的作品 - 但我不明白为什么。是因为TextBox上的TextWrapping具有默认值还是其他值? – 2008-10-31 16:20:38

-1

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

+0

错误。它可以在xaml中完成。 – Will 2008-10-30 17:08:43

0

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

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

一个想法是使用.NET Reflector,导航到System.Windows.Data.IValueConverter,然后使用分析功能(特别是'使用'),看看有什么事情已经实现了IValueConverter ...和你可能会很幸运找到适合你的目的的转换器。

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

编辑: 我真的很喜欢托德怀特的建议风格的文本框和风格的DataTrigger。如果你想避免一个转换器,这是一个非常好的主意。

相关问题