WPFは、スタイルを使用してネストされた要素内から親プロパティにバインドします

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

  •  30-09-2019
  •  | 
  •  

質問

空の間に表示されるヒントを使用してテキストボックスを作成しようとしています。スタイル内からヒントテキストを設定するのに苦労しています。

正確には、これ 作品 (つまり、正しく結合する):

    <TextBox Tag="hint text">
        <TextBox.Background>
            <VisualBrush Stretch="None">
                <VisualBrush.Visual>
                    <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" />
                </VisualBrush.Visual>
            </VisualBrush>
        </TextBox.Background>
    </TextBox>

しかし、私がそれをスタイルに移動するとき、それはそうではありません:

<Style TargetType="TextBox" x:Key="stlHintbox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
            <Setter Property="Background">
                <Setter.Value>
                    <VisualBrush Stretch="None">
                        <VisualBrush.Visual>
                            <TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" 
                                       FontStyle="Italic" Foreground="LightGray" />
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" />

では、キャッチは何ですか?スタイル内から先祖の財産にバインドするにはどうすればよいですか?

役に立ちましたか?

解決

問題は、親RelativeSourceではなく、VisualBrushの使用方法にあります。スタイルは、それらを適用する要素間で共有されていることを思い出してください。あなたの例がうまくいかない理由は、実際には、複数の親テキストボックスを使用して単一のテキストボックス(「内側」とタグ付けしたもの)を共有しようとしているからです。

これが問題である理由を確認するには、思考実験を試してください。内側のテキストボックスが一度作成されます(大まかに言えば、これはスタイルが作成されたときに起こります)。 RelativeSourceバインディングを使用する際に、スタイルが適用されるテキストボックスのどれを内側のテキストボックスの祖先として選択する必要がありますか?

これが理由です dataTemplatesControlTemplates WPFに存在します。実際にビジュアルを直接インスタンス化するのではなく、必要に応じて複数のビジュアルを作成できるテンプレートを定義します。

他のヒント

ReativeSourceは期待どおりに機能しません。コントロールテンプレートを使用して透かしテキストボックスを作成することをお勧めします。しかし、あなたのバージョンは機能する可能性があります:

<Window.Resources>
    <Style TargetType="TextBox" x:Key="stlHintbox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
                <Setter Property="TextBox.Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" />
    <Border Visibility="Hidden">
        <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" />
    </Border>
</StackPanel>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top