2017-01-20 2 views
1

Я готов к злоупотреблению. Я не могу понять, почему это не работает.TreeView не заполняется из XML

Вот соответствующий XAML:

<Window.Resources> 
    <XmlDataProvider x:Key="Family" Source="TestArmy1.xml" XPath="/Army"/> 
</Window.Resources> 

// Снип

<TreeView Name="OOB" Height="880" Background="#00000000" 
      BorderBrush="#00000000" Padding="100,1,1,50" UseLayoutRounding="False" 
      MouseRightButtonDown="TreeViewPreviewRightButtonDown" DataContext="{StaticResource Family}" ItemsSource="{Binding XPath=Commander}" FontSize="12" /> 

Вот C# код:

 //This is for dynamically building a treeview with templates from an XML file 
     XmlTextReader xmlReader1 = new XmlTextReader("HierarchicalDataTemplate1.xml"); 
     HierarchicalDataTemplate hierarchicalDataTemplate1 = XamlReader.Load(xmlReader1) as HierarchicalDataTemplate; 

     XmlTextReader xmlReader2 = new XmlTextReader("HierarchicalDataTemplate2.xml"); 
     HierarchicalDataTemplate hierarchicalDataTemplate2 = XamlReader.Load(xmlReader2) as HierarchicalDataTemplate; 
     hierarchicalDataTemplate1.ItemTemplate = hierarchicalDataTemplate2; 

     XmlTextReader xmlReader3 = new XmlTextReader("HierarchicalDataTemplate3.xml"); 
     HierarchicalDataTemplate hierarchicalDataTemplate3 = XamlReader.Load(xmlReader3) as HierarchicalDataTemplate; 
     hierarchicalDataTemplate2.ItemTemplate = hierarchicalDataTemplate3; 

    OOB.ItemTemplate = hierarchicalDataTemplate1; 

    Thread updateThread = new Thread(new ParameterizedThreadStart(UpdateTree)); 
    updateThread.Start(this); 

И код, который строит TreeView:

private void UpdateTree(object obj) 
    { 
     if (File.Exists("TestArmy1.xml") == false) 
     { 
      MessageBox.Show("Unable to open\nTestArmy1.xml"); 
      return; 
     } 

     MainWindow window = (MainWindow)obj; 
     window.Dispatcher.Invoke(DispatcherPriority.Send, new Action(RebuildTree)); 
    } 

    private void RebuildTree() 
    { 
     XmlDataProvider provider = new XmlDataProvider(); 
     XmlDocument xmlFile = new XmlDocument(); 
     xmlFile.Load("TestArmy1.xml"); 
     provider.Document = xmlFile; 
     provider.XPath = "/Army"; 

     OOB.DataContext = provider; 

     XmlNode node = xmlFile.DocumentElement.SelectSingleNode("ArmyName"); 
     ArmyNameString = node.InnerText; 
     ArmyNameTitle.Content = ArmyNameString; 

    } 

Это (теперь урезанную) XML-файл, TestArmy1.xml, который загружается:

<?xml version="1.0" encoding="UTF-8"?> 
<Army> 
    <ArmyName>The Army of Northern Virginia</ArmyName> 
    <Commander> 
     <CommanderName>The Emperor With the Very Long Name!</CommanderName> 
     <CommanderLeadership>94</CommanderLeadership> 
      <Division> 
       <DivisionCommanderName>Major General William T. Sherman</DivisionCommanderName> 
       <DivisionCommanderLeadership>78</DivisionCommanderLeadership> 
        <Unit> 
         <UnitName>'Chasseurs à Cheval Garde"</UnitName> 
         <UnitType>Cavalry</UnitType> 
         <UnitKStrength>3</UnitKStrength> 
         <UnitStrength>456</UnitStrength> 
         <UnitQuality>10</UnitQuality> 
         <UnitMorale>7</UnitMorale> 
         <UnitLeadership>7</UnitLeadership> 
         <UnitAmmunition>99</UnitAmmunition> 
        </Unit> 
       </Division> 
      <Division> 
       <DivisionCommanderName>Marshal Ney</DivisionCommanderName> 
       <DivisionCommanderLeadership>8</DivisionCommanderLeadership> 
      </Division> 
    </Commander> 
</Army> 

Вот HierarchicalDataTemplate1:

<HierarchicalDataTemplate 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    ItemsSource="{Binding XPath=Commander}" 
    > 

    <Grid Height="62" Width="auto"> 
     <Grid Height="61" HorizontalAlignment="Left" Margin="0,0,0,0" Name="grid1" VerticalAlignment="Top" Width="auto"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="25" /> 
       <RowDefinition Height="30" /> 
      </Grid.RowDefinitions> 
      <Image Source= "HeadQuarters.png" Grid.Column="1" Grid.RowSpan="2" HorizontalAlignment="Center" Stretch="None" OpacityMask="White"></Image> 
      <Label Content="{Binding XPath=CommanderName}" Height="54" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" FontFamily="K22 Monastic" FontSize="36" Margin="2,4,0,6" Grid.RowSpan="2" Grid.Column="2" /> 
      <Label Content="Leadership:" HorizontalAlignment="Left" Margin="5,0,0,0" VerticalAlignment="Bottom" Grid.Column="3" /> 
      <ProgressBar HorizontalAlignment="Left" Height="20" Name="CommanderLeadershipProgressBar" VerticalAlignment="Top" Width="150" Grid.Column="3" Grid.Row="2" Margin="10,0,0,0" Minimum="1" Maximum="100" Value="{Binding XPath=CommanderLeadership}" /> 
     <TextBlock Text="{Binding ElementName=CommanderLeadershipProgressBar, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Column="3" Grid.Row="2" /> 
      <Button Content="Create Subordinate Unit" Height="35" Width="auto" HorizontalAlignment="Left" Margin="10,0,50,0" Name="button1" VerticalAlignment="Center" Grid.Column="4" Grid.RowSpan="2" /> 

     </Grid> 
</Grid> 

А вот HierarchialDataTemplate2:

<HierarchicalDataTemplate 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    ItemsSource="{Binding XPath=Commander}" 
    > 

    <Grid Height="62" Width="auto"> 
     <Grid Height="61" HorizontalAlignment="Left" Margin="0,0,0,0" Name="grid1" VerticalAlignment="Top" Width="auto"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="25" /> 
       <RowDefinition Height="30" /> 
      </Grid.RowDefinitions> 
      <Image Source= "HeadQuarters.png" Grid.Column="1" Grid.RowSpan="2" HorizontalAlignment="Center" Stretch="None" OpacityMask="White"></Image> 
      <Label Content="{Binding XPath=CommanderName}" Height="54" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" FontFamily="K22 Monastic" FontSize="36" Margin="2,4,0,6" Grid.RowSpan="2" Grid.Column="2" /> 
      <Label Content="Leadership:" HorizontalAlignment="Left" Margin="5,0,0,0" VerticalAlignment="Bottom" Grid.Column="3" /> 
      <ProgressBar HorizontalAlignment="Left" Height="20" Name="CommanderLeadershipProgressBar" VerticalAlignment="Top" Width="150" Grid.Column="3" Grid.Row="2" Margin="10,0,0,0" Minimum="1" Maximum="100" Value="{Binding XPath=CommanderLeadership}" /> 
     <TextBlock Text="{Binding ElementName=CommanderLeadershipProgressBar, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Column="3" Grid.Row="2" /> 
      <Button Content="Create Subordinate Unit" Height="35" Width="auto" HorizontalAlignment="Left" Margin="10,0,50,0" Name="button1" VerticalAlignment="Center" Grid.Column="4" Grid.RowSpan="2" /> 

     </Grid> 
</Grid> 

И вот HierarchicalDataTemplate3:

<HierarchicalDataTemplate 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    ItemsSource="{Binding XPath=Unit}" 
    > 

    <Grid Height="62" Width="auto"> 
     <Grid Height="61" HorizontalAlignment="Left" Margin="0,0,0,0" Name="grid1" VerticalAlignment="Top" Width="auto"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="25" /> 
       <RowDefinition Height="30" /> 
      </Grid.RowDefinitions> 

      <Label Content="{Binding XPath=UnitName}" Height="54" HorizontalAlignment="Left" Name="label4" VerticalAlignment="Top" FontFamily="K22 Monastic" FontSize="36" Margin="2,4,0,6" Grid.RowSpan="2" Grid.Column="2" /> 

     </Grid> 
</Grid> 

И это (новый) выход: enter image description here

Что хорошо, насколько это идет (если кто-то интересно, я создаю то, что называется Орден Боевого таблицы для Wargame). Но он не продолжает строить весь TreeView. Я думаю, что это просто чтение первого узла и остановка.

Что мне не хватает? Спасибо за помощь. Не стесняйтесь бить меня.

ответ

1

Если я понимаю вашу проблему и вопрос правильно, это то, что вспомогательные узлы Commander, которые могут быть разделены, не отображают?

В этом случае вы должны установить ItemsSource из HierarchicalDataSource в «Отдел» вместо Commander:

<HierarchicalDataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ItemsSource="{Binding XPath=Division}"> 

Затем можно включать в шаблон данных для встроенного Дивизион узла, как показано ниже, или определить его в другом месте:

 <HierarchicalDataTemplate.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding XPath=DivisionCommanderName}" /> 
    </DataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 

Этот шаблон может быть HierarchicalDataTemplate, если у вас больше подузлов.

Edit:

В C# -кода может быть недоразумение в иерархии шаблонов:

//This is for dynamically building a treeview with templates from an XML file 
    XmlTextReader xmlReader1 = new XmlTextReader(@"E:\Temp\HierarchicalDataTemplate1.xml"); 
    HierarchicalDataTemplate hierarchicalDataTemplate1 = XamlReader.Load(xmlReader1) as HierarchicalDataTemplate; 

    XmlTextReader xmlReader2 = new XmlTextReader("HierarchicalDataTemplate2.xml"); 
    HierarchicalDataTemplate hierarchicalDataTemplate2 = XamlReader.Load(xmlReader2) as HierarchicalDataTemplate; 
    // Original: hierarchicalDataTemplate2.ItemTemplate = hierarchicalDataTemplate2; 
    hierarchicalDataTemplate1.ItemTemplate = hierarchicalDataTemplate2; 

    XmlTextReader xmlReader3 = new XmlTextReader("HierarchicalDataTemplate3.xml"); 
    HierarchicalDataTemplate hierarchicalDataTemplate3 = XamlReader.Load(xmlReader3) as HierarchicalDataTemplate; 
    // Oridignal: hierarchicalDataTemplate3.ItemTemplate = hierarchicalDataTemplate3; 
    hierarchicalDataTemplate2.ItemTemplate = hierarchicalDataTemplate3; 

И далее: шаблоны должны отражать узлы их соответствующего уровня.

+0

Да, это проблема. Я отредактировал вышеупомянутое сообщение, чтобы показать HierarchicalDataTemplate2.Я подумал (думаю), что я реализовал то, что вы предложили для второго шаблона данных, но «он не подбирает». – zetar

+0

Да, HierarchicalDataTemplates были неправильными ... они были правильными раньше, а затем я изменил их, потому что я идиот. Я вернул их к тому, как они были раньше (что точно так же, как вы указали), но все же только видя первый отображаемый узел. – zetar

+0

@zetar: точно, и это не работает, потому что ваш ItemSource ошибочно настроен на'Commander ', а не, например,'Division' - с его установкой Commander ожидается, что Командиры станут детьми Commander, а это не true в отображаемом xml-фрагменте. –

Смежные вопросы