2010-09-03 14 views
13

Ich habe versucht, ein Textfeld mit einem Hinweis zu bauen, die Anzeige ist, während es leer ist. Ich habe Probleme, den Hinweistext innerhalb eines Stils zu setzen.WPF Binden an übergeordneter Eigenschaft aus verschachteltem Elemente Stil mit

Um genau zu sein, diese arbeitet (das heißt, es richtig bindet):

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

aber, wenn ich es auf den Stil zu bewegen, ist es nicht:

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

Also, was ist der Haken? Wie kann ich innerhalb eines Styles an die Vorgängereigenschaft binden?

Antwort

12

Das Problem ist nicht mit dem Relative ist aber mit der Art und Weise Sie die VisualBrush verwenden. Denken Sie daran, dass Styles für die Elemente, auf die Sie sie anwenden, gemeinsam genutzt werden. Der Grund, dass Ihr Beispiel nicht funktioniert, ist, dass in der Tat Sie versuchen, eine einzelne Textbox zu teilen (die Sie „innere“ markiert) mit mehreren übergeordneten Textfeldern.

Um zu sehen, warum dies ein Problem ist, versuchen Sie ein Gedankenexperiment: Die innere Textbox wird einmal erstellt (grob gesagt, das wird passieren, wenn der Stil erstellt wird). Welche der Textfelder, die der Stil angewendet wird sollte als der Vorfahr des inneren Textfeld gewählt werden, wenn Sie die Bindung Relative verwenden?

Aus diesem Grund DataTemplates und ControlTemplates in WPF existieren. Anstatt Grafiken direkt zu instanziieren, definieren sie eine Vorlage, die es ermöglicht, mehrere Kopien von Visuals nach Bedarf zu erstellen.

+0

Ok, das wirklich Sinn macht ... ich durch Bücher übergeben zu schnell scheint es :) – veljkoz

5

Reativesource funktioniert nicht wie erwartet. Es ist besser, Wasserzeichen Textbox mit Steuerelement Vorlage erstellen. Aber Ihre Version funktionieren könnte:

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

Das ist in Ordnung, aber es hindert mich daran, mehr als eine Andeutungsbox im selben Fenster zu haben, und seine Verwendung wäre nicht so offensichtlich. Danke für die Anregung auf Steuervorlagen, ich werde schauen hinein mehr ... – veljkoz

Verwandte Themen