2011-03-23 2 views
3

내 xml을 TreeView에 바인딩하고 선택한 TreeViewItem을 TextBox에 바인딩합니다. 이제 두 개의 TextBox가 필요합니다. 첫 번째 항목은 TreeViewItem이 선택 될 때 활성화해야하며 항목이 "./title"범주 인 경우 TextBox- 콘텐츠의 XPath를 "@name"으로 변경해야합니다. 두 번째 항목은 선택한 항목이 카드 인 경우에만 활성화해야합니다.WPF의 XPath 바인딩 동역학 변경

wpf에서만 가능합니까? 그리고 어떻게?

트 리뷰 출력 :

o Categoryname 
    - something 
    o SubCategory 
     - something else 
- text    

XML :

<root> 
    <cards> 
    <category name="Categoryname"> 
     <card> 
     <title>something</title> 
     <content>the content</content> 
     .. 
     </card> 
     <category name="SubCategory"> 
     <card> 
      <title>something else</title> 
      <content>the content</content> 
      ... 
     </card> 
     </category> 
    </category> 
    <card> 
     <title>text</title> 
     <content>the content</content> 
     .. 
    </card> 
    </cards> 
</root> 

텍스트 상자 (상황이 지금과 같이) :

<TextBox Name="textBoxTitel" 
     DataContext="{Binding ElementName=listViewCards, Path=SelectedItem}" 
     Text="{Binding XPath=./title, UpdateSourceTrigger=PropertyChanged}" 
     IsReadOnly="False"> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=listViewCards, Path=SelectedItem}" Value="{x:Null}"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

편집 :

는 두 번째이 시도 케이스를 사용할 수는 없습니다. 텍스트 상자 :

(요소 형 카드의 경우에만 텍스트 상자를 사용)

<TextBox IsEnabled="False" DataContext="{Binding ElementName=treeView, Path=SelectedItem}"> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding LocalName}" Value="card"> 
        <Setter Property="Text" Value="{Binding XPath=./question, UpdateSourceTrigger=PropertyChanged}"/> 
        <Setter Property="IsEnabled" Value="True"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

답변

1

나는이 권리를 이해 희망, 다음이 작동합니다 :

<TextBox Name="textBoxTitel" 
     DataContext="{Binding ElementName=listViewCards, Path=SelectedItem}" 
     IsReadOnly="False"> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding}" Value="{x:Null}"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding LocalName}" Value="category"> 
        <Setter Property="Text" Value="{Binding [email protected], UpdateSourceTrigger=PropertyChanged}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding LocalName}" Value="card"> 
        <Setter Property="Text" Value="{Binding XPath=./title, UpdateSourceTrigger=PropertyChanged}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
<TextBox Name="secondTextBox" 
     DataContext="{Binding ElementName=listViewCards, Path=SelectedItem}" 
     IsReadOnly="False"> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Setter Property="IsEnabled" Value="False"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding LocalName}" Value="card"> 
        <Setter Property="IsEnabled" Value="True"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
+0

는 첫 번째 경우에서 완벽하게 작동 두 번째 경우에만 요소가 형식 카드에서 경우에만 사용할 수있는 텍스트 상자가 필요합니다, 당신이 내게 어떻게 완료 표시 할 수 있습니까? 나는 datatriggers에 익숙하지 않다 :-( – jwillmer

+0

@myName은 두 번째 텍스트 상자로 내 코드를 업데이트했다. –

+0

완벽하게 작동한다! – jwillmer