簡體   English   中英

如何將TextBox的TextWrapping屬性綁定到MenuItem的IsChecked值?

[英]How do you bind the TextWrapping property of a TextBox to the IsChecked value of a MenuItem?

TextBox的TextWrapping屬性有三個可能的值:

  • 包裹
  • NoWrap的
  • WrapWithOverflow

我想綁定到MenuItem的IsChecked屬性。 如果選中了MenuItem,我想將TextBox的TextWrapping屬性設置為Wrap。 如果未選中MenuItem,我想將TextBox的TextWrapping屬性設置為NoWrap。

總而言之,我試圖將具有兩個狀態的控件綁定到具有兩個以上值的枚舉的兩個值。

[edit]我想在XAML中完成這個,如果可能的話。

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

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

我認為 唯一正確 的方法是使用像您已經完成的值轉換器。

有時您可以找到已經構建的現有值轉換器......或者甚至是Microsoft為您構建的更好的轉換器。 例如,在System.Windows.Controls中,Microsoft編寫了一個BooleanToVisibilityConverter ...,它將bool轉換為Visibility枚舉...將True轉換為Visible,將False轉換為Collapsed(並且不用擔心隱藏)。

一個想法是使用.NET Reflector,導航到System.Windows.Data.IValueConverter,然后使用Analyze功能(特別是'Used by'),看看有什么東西實現了IValueConverter ......你可能會得到很幸運能找到適合您目的的轉換器。

在相關的說明中,BooleanToVisibilityConverter與您在上面嘗試的操作非常相似。

編輯:我真的很喜歡托德懷特關於設置TextBox樣式並在樣式中使用DataTrigger的建議。 如果你想避免轉換器,這是一個非常好的主意。

我假設你在談論.NET。 我不認為數據綁定在這里會起作用,因為值的類型不同(boolean vs enum)。 最簡單的解決方案是處理該菜單項的CheckedChanged事件並相應地調整文本框的包裝模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM