2017-02-23 8 views
2

私のプロジェクトでは、私はエキスパンダーであるカスタムコントロールを持っています。コントロールの展開または折りたたみを行うボタンのコンテンツは、状態によって変わる必要があります。私は仕事のほとんどを持っているが、私はボタンのために使用するコンテンツにテキストをバインドするのに失敗する。ここでプロパティにバインドするWPF TextBlockを取得できません

はGeneric.xamlから私の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> 

あなたは、私はいくつかの矢印でGROUP_BOXのヘッダを結合するために、ネストされたテキストブロックを使用して見ることができるように。ただし、中間のテキストブロックのバインディングは機能しません。

正に、私はWPFを使っていますが、データソースを(適切なソースに)バインドすることはまだ私にとって謎です。ほとんどの場合、私は何とかそれを働かせますが、失敗した場合、私はアイデアを何もしません。私は数時間グーグルで試してみましたが、さまざまなことを試みましたが、何も私のために働いていませ

何か助けていただければ幸いです。

答えて

1

あなたはExpanderContentHeaderに特異的に結合することができます:

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

あなたはそれがButtonと同じ名前のスコープではないのでGroupBoxに直接結合するElementNameを使用することはできません。

編集:エクスパンダは、デフォルトでは折りたたまれている場合

[OK]を、それだけで動作します。

しかし、あなたはGroupBoxにバインドするx:Referenceを使用することができます。

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

残念ながら、これは動作しません。 BindingExpression:Path = Content.Header; DataItem = null;対象要素が 'TextBlock'(Name = '');であり、出力が "System.Windows.Data Error:4:参照 'ElementName = expander' targetプロパティは 'Text'(タイプ 'String') " – Takiro

+0

ありがとう、これは完全に動作します。 x:Referenceを使用する必要がある理由を説明できますか? ElementNameとx:Referenceは基本的に同じように動作します。また、MSDNによれば、「ほとんどのWPFアプリケーションとシナリオでは、ElementNameバインディングを使用する必要があります。 – Takiro

+0

ElementNameとxの違いについては、次の質問を参照してください。参照:http://stackoverflow.com/questions/19244111/what-is-the-difference-between-xreference-and-elementname – mm8

関連する問題