Изменение XPath-Binding динамически в WPF - PullRequest
3 голосов
/ 23 марта 2011

Я связал свой xml с TreeView и связал выбранный TreeViewItem с TextBox. Теперь мне нужно два TextBox. Первый должен включаться, когда выбран TreeViewItem, и должен изменять XPath для TextBox-Content на «@name», если элемент относится к другой категории, на «./title». А второй должен включаться только в том случае, если выбранный элемент является картой.

Это возможно только с 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 (как сейчас):

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

Edit:

a попробовал это для второго случая, но текстовое поле не включается:

(Включить текстовое поле только в том случае, если элемент относится к карточке типа)

<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 Ответ

1 голос
/ 23 марта 2011

Надеюсь, я правильно понял, тогда это должно сработать:

<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 XPath=@name, 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> 
...