6

TextBox の TextWrapping プロパティには、次の 3 つの値があります。

  • 包む
  • ラップなし
  • WrapWithOverflow

MenuItem の IsChecked プロパティにバインドしたいと思います。MenuItem がチェックされている場合、TextBox の TextWrapping プロパティを Wrap に設定したいと考えています。MenuItem がチェックされていない場合、TextBox の TextWrapping プロパティを NoWrap に設定したいと考えています。

要約すると、2 つ以上の値を持つ列挙型の 2 つの値に 2 つの状態を持つコントロールをバインドしようとしています。

[編集]可能であれば、これを 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();
        }
    }
4

3 に答える 3

10

これをすべてxamlで実行する場合は、 Styleと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>
于 2008-10-31T00:54:03.380 に答える
0

これを行うための唯一の正しい方法は、すでに行ったように値コンバーターを使用することだと思います。

場合によっては、既に構築した既存の値コンバーターを見つけることができます...またはMicrosoftが構築したものよりも優れています。たとえば、System.Windows.Controlsで、MicrosoftはBooleanToVisibilityConverter ...を作成しました。これはboolをVisibility列挙型に変換します...TrueをVisibleに、FalseをCollapsedに変換します(非表示については心配しません)。

1つのアイデアは、.NET Reflectorを使用し、System.Windows.Data.IValueConverterに移動してから、分析機能(特に、「使用者」)を使用して、IValueConverterが実装されているものを確認することです。あなたの目的に合ったコンバーターを見つけることができて幸運です。

関連する注意点として、BooleanToVisibilityConverterは、上記で実行しようとしていることと非常によく似ています。

編集: 私は、TextBoxのスタイルを設定し、スタイルでDataTriggerを使用するというToddWhiteの提案が本当に好きです。コンバーターを避けたい場合は非常に良い考えです。

于 2008-10-30T19:36:58.403 に答える
-2

.NET について話していると思います。値が同じ型(ブール値と列挙型)ではないため、ここではデータバインディングが機能しないと思います。最も簡単な解決策は、そのメニュー項目の CheckedChanged イベントを処理し、それに応じてテキスト ボックスのラップ モードを調整することです。

于 2008-10-30T17:07:01.060 に答える