2017-02-23 5 views
2

In meinem Projekt habe ich ein benutzerdefiniertes Steuerelement, das ein Expander ist. Der Inhalt der Schaltfläche, durch den das Steuerelement erweitert oder reduziert wird, sollte sich je nach Status ändern. Ich habe das meiste davon zu arbeiten, aber ich scheitere Text an den Inhalt, den ich für den Knopf verwende.WPF TextBlock kann nicht an die Eigenschaft gebunden werden

Hier ist mein XAML-Code aus generic.xaml:

<ControlTemplate x:Key="PndExpanderControlVertical" TargetType="{x:Type local:PndExpanderControl}"> 
    <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto" /> 
      </Grid.ColumnDefinitions> 

      <dx:DXExpander x:Name="expander" Grid.Column="0" FlowDirection="LeftToRight" VerticalExpand="None" HorizontalExpand="FromLeftToRight" IsExpanded="True"> 
       <dxlc:GroupBox x:Name="group_box" Padding="0" Header="Header"/> 
      </dx:DXExpander> 

      <Button Grid.Column="1" Padding="1" x:Name="expand_button"> 
       <Button.Style> 
        <Style TargetType="Button"> 
         <Style.Triggers> 
          <!-- Button-Style, expanded --> 
          <DataTrigger Binding="{Binding IsExpanded, ElementName=expander}" Value="True"> 
           <Setter Property="Content" Value="↧ ↧"/> 
           <Setter Property="LayoutTransform"> 
            <Setter.Value> 
             <RotateTransform Angle="90"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
          <!-- Button-Style, collapsed --> 
          <DataTrigger Binding="{Binding IsExpanded, ElementName=expander}" Value="False"> 
           <Setter Property="Content"> 
            <Setter.Value> 
             <TextBlock> 
              <TextBlock Text="↥ "/> 
              <TextBlock Text="{Binding Header, ElementName=group_box}"/> 
              <TextBlock Text=" ↥"/> 
             </TextBlock> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="LayoutTransform"> 
            <Setter.Value> 
             <RotateTransform Angle="90"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </Button.Style> 
      </Button> 
     </Grid> 
    </Border> 
</ControlTemplate> 

Wie man sehen kann ich einen verschachtelten Textblock der group_box Header mit einigen Pfeilen zu kombinieren. Die Bindung des mittleren Textblocks funktioniert jedoch nicht.

Um ehrlich zu sein, arbeite ich seit einiger Zeit mit WPF, aber Datenbindung (an die richtige Quelle) ist für mich immer noch ein Rätsel. Die meiste Zeit bekomme ich es irgendwie zur Arbeit, aber wenn es scheitert, habe ich keine Idee, was zu tun ist. Ich habe ein paar Stunden gegoogelt und verschiedene Sachen probiert, aber nichts hat für mich funktioniert.

Jede Hilfe wird geschätzt.

Antwort

1

Sie binden könnte auf die Header des Content des Expander:

<TextBlock Text="↥ "/> 
<TextBlock Text="{Binding Content.Header, ElementName=expander}"/> 
<TextBlock Text=" ↥"/> 

Sie können keine ElementName verwenden, um direkt an die GroupBox zu binden, da sie nicht in dem gleichen Namen Tragweite wie das Button ist.

Edit:

Ok, es funktioniert nur, wenn der Expander standardmäßig reduziert wird.

Aber Sie könnten einen x:Reference verwenden, um die GroupBox zu binden:

<TextBlock Text="↥ "/> 
<TextBlock Text="{Binding Header, Source={x:Reference group_box}}"/> 
<TextBlock Text=" ↥"/> 
+0

Leider funktioniert das nicht. Die Ausgabe sagt "System.Windows.Data Error: 4: Quelle für die Bindung mit Verweis nicht gefunden" ElementName = Expander '. BindingExpression: Path = Content.Header; DataItem = null; Zielelement ist' TextBlock '(Name =' '); Ziel Eigenschaft ist 'Text' (Typ 'String') " – Takiro

+0

Danke, das funktioniert perfekt. Können Sie erklären, warum x: Referenz verwendet werden muss? Von dem, was ich in einer schnellen Suche gefunden habe Elementname und x: Referenz arbeiten grundsätzlich gleich. Auch MSDN sagt: "Für die meisten WPF-Anwendungen und -Szenarien sollte die ElementName-Bindung weiterhin verwendet werden." – Takiro

+0

Informationen zu den Unterschieden zwischen ElementName und x finden Sie in der folgenden Frage: Referenz: http://stackoverflow.com/questions/19244111/what-is-the-difference-between-xreference-and-elementname – mm8

Verwandte Themen