Выберите отдельные элементы, связанные с XML, в TreeView - PullRequest
0 голосов
/ 09 октября 2009

Я пытаюсь узнать, как связать следующий простой XML-файл с WPF TreeView:

<?xml version="1.0" encoding="utf-8" ?>
<Profiles>

  <Customer>
    <Name>Customer1</Name>    
    <Profile>
      <Version>1.0</Version>
      <DisplayText>DisplayText1</DisplayText>
    </Profile>
    <Profile>
      <Version>1.0</Version>
      <DisplayText>DisplayText2</DisplayText>
    </Profile>
  </Customer>

  <Customer>
    <Name>Customer2</Name>    
    <Profile>
      <Version>1.0</Version>
      <DisplayText>DisplayText3</DisplayText>
    </Profile>    
  </Customer>

</Profiles>

Вот мой XAML-код попытки:

 <TreeView DockPanel.Dock="Left" Height="auto" Name="treeView1" Width="217"
           SelectedItemChanged="UIProfileTreeViewSelectedItemChanged"
           ItemsSource="{Binding}">
     <TreeView.DataContext>
         <XmlDataProvider Source="Profiles.xml" XPath="/Profiles/Customer"/>
     </TreeView.DataContext>
     <TreeView.Resources>
         <DataTemplate DataType="Customer">
             <TreeViewItem Header="{Binding XPath=Name}"
                           ItemsSource="{Binding XPath=Profile}"/>
         </DataTemplate>                
         <DataTemplate DataType="Profile">
             <TreeViewItem Header="{Binding XPath=DisplayText}" />
         </DataTemplate>                
     </TreeView.Resources> 
 </TreeView>

Однако результаты не позволяют мне выбрать отдельные профили под клиентом в TreeView, если я щелкну один профиль, вся группа будет выделена следующим образом:

альтернативный текст http://img38.imageshack.us/img38/4484/sberr.png

У меня явно есть концептуальная ошибка с тем, как работают элементы с привязкой к данным. Есть указатели?

1 Ответ

1 голос
/ 09 октября 2009

Я смог заставить это работать с xaml ниже.

Были две основные проблемы, с которыми я столкнулся с вашим кодом:

  1. Оба уровня вашего древовидного представления использовали «DataTemplate» вместо «внешнего», определяемого как «HierarchicalDataTemplate» - поэтому вы должны были поместить ItemsSource в TreeViewItem, который, по-видимому, вызвал выбор группа "выпуск
  2. У меня были проблемы с тем, чтобы выделение работало вообще при использовании TreeViewItems, но после преобразования шаблонов DataTemplates в отображение метки (здесь можно отобразить любой простой или сложный набор элементов управления), все заработало отлично. WPF автоматически вставляет элементы управления TreeViewItem, чтобы обернуть все, что вы связываете в TreeView, так что вам не нужно делать это явно.

        <TreeView DockPanel.Dock="Left" Height="auto" Name="treeView1" Width="217" SelectedItemChanged="UIProfileTreeViewSelectedItemChanged" ItemsSource="{Binding}">
          <TreeView.DataContext>
            <XmlDataProvider Source="Profiles.xml" XPath="/Profiles/Customer"/>
          </TreeView.DataContext>
          <TreeView.Resources>
            <HierarchicalDataTemplate DataType="Customer" ItemsSource="{Binding XPath=Profile}">
                <Label Content="{Binding XPath=Name}" />
            </HierarchicalDataTemplate>
            <DataTemplate DataType="Profile">
                <Label Content="{Binding XPath=DisplayText}" />
            </DataTemplate>
          </TreeView.Resources>
        </TreeView>
    

Надеюсь, это поможет!

...