WPF Bind alla proprietà parent dall'interno elemento nidificato utilizzando lo stile

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

  •  30-09-2019
  •  | 
  •  

Domanda

ho cercato di costruire una casella di testo con un suggerimento che è la visualizzazione mentre è vuota. Sto avendo l'impostazione del testo di suggerimento dall'interno di uno stile di guai.

Per essere precisi, questa lavori (che è, si lega in modo corretto):

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

, ma, quando mi sposto allo stile, lo fa non:

<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}" />

Allora, qual è il trucco? Come posso legano a un antenato proprietà all'interno di uno stile?

È stato utile?

Soluzione

Il problema non è con il RelativeSource, ma con il modo in cui si utilizza il VisualBrush. Ricordiamo che gli stili sono condivisi tra gli elementi di applicarle a. La ragione per cui il tuo esempio non funziona è che, in effetti si sta tentando di condividere un unico testo (quello che tagged "interno") con più caselle di testo genitore.

Per capire perché questo è un problema, provare un esperimento mentale: La casella di testo interno viene creato quando (grosso modo, questo accadrà quando viene creato lo stile). Quale delle caselle di testo che lo stile viene applicato al dovrebbe essere scelto come l'antenato della casella di testo interna quando si utilizza il RelativeSource vincolante?

Questo è il motivo per cui DataTemplates e ControlTemplate esistono in WPF. Invece di immagini in realtà direttamente un'istanza, essi definiscono un modello che consentono più copie di immagini da creare in base alle esigenze.

Altri suggerimenti

Reativesource non funziona come previsto. E 'meglio creare filigrana di testo utilizzando il modello di controllo. Ma la versione potrebbe funzionare:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top