2011-03-23 59 views
3

我已將我的xml綁定到TreeView,並將我選擇的TreeViewItem綁定到TextBox。 現在我需要兩個TextBox。第一個應該在選擇TreeViewItem時啓用,並且如果該項目是其他類別爲「./title」,則必須將TextBox-Content的XPath更改爲「@name」。 而第二個應該只在選定的項目是卡時啓用。更改WPF中的XPath綁定動態

這隻能用wpf嗎?如何?

TreeView的輸出:

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 2011-03-23 12:09:24

+0

@myName更新我的代碼與第二個文本框 – 2011-03-23 12:24:34

+0

完美的作品!thx很多;-) – jwillmer 2011-03-23 12:30:59