2017-01-20 5 views
1

私は虐待の準備ができています。なぜこれが機能していないのかわかりません。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> 

<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で​​す

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

限り、それは(誰もが興味を持っているならば、私はウォーゲームの戦い表の順序と呼ばれるものを構築しています)行くと罰金です。しかし、TreeView全体を構築し続けるわけではありません。私はそれがちょうど最初のノードを読んで停止していると思う。

私には何が欠けていますか?助けてくれてありがとう。私を打ち負かすことは自由に感じてください。

答えて

1

私はあなたの問題と疑問を正しく理解していれば、ディビジョンになる可能性のあるCommanderのサブノードはレンダリングされません。あなたが代わりに指揮官の「課」にHierarchicalDataSourceののItemsSourceを設定する必要があり、その場合には

<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になる可能性があります。

編集:

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

さらに:テンプレートは、対応するレベルのノードを反映しなければならないC#の

は、テンプレートの階層で誤解があってもよい-code。

+0

はい、これは問題です。上記の投稿を編集してHierarchicalDataTemplate2を表示しました。私は思った(考えて)私はあなたが2番目のデータテンプレートのために提案したものを実装しましたが、それはそれを拾うのではありません。 – zetar

+0

はい、HierarchicalDataTemplatesは間違っていました...以前は正しかったですし、私はばかだから変更しました。私はそれらを以前のように戻します(これはあなたが指摘した通りです)が、最初のノードが表示されているだけです。 – zetar

+0

@zetar:正確には、あなたのItemsSourceが間違って'Division 'ではなく' Command 'に設定されているので、機能しません。Commanderに設定すると、Commanderの子であることが期待されます。あなたが表示するXMLスニペットで真。 –

関連する問題