TextBoxのTextWrappingプロパティをMenuItemのIsChecked値にどのようにバインドしますか?

StackOverflow https://stackoverflow.com/questions/250840

質問

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

  • ラップ
  • NoWrap
  • WrapWithOverflow

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

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

[編集] 可能であれば、XAMLでこれを達成したいです。

[編集] IValueConverterを使用してこれを行う方法を見つけました。おそらくこれを行うためのより良い方法がありますか?これが私がしたことです:


Window.Resourcesで、ValueConverterへの参照を宣言しました。

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

TextBoxで、MenuItemへのバインディングを作成し、バインディングステートメントにコンバーターを含めました。

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で行いたい場合は、スタイルおよび 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>

他のヒント

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

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

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

関連するメモでは、BooleanToVisibilityConverterは上記の操作と非常によく似ています。

編集: TextBoxをスタイリングし、StyleでDataTriggerを使用するというTodd Whiteの提案が本当に気に入っています。コンバータを回避したい場合は非常に良いアイデアです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top