Я готов к злоупотреблению. Я не могу понять, почему это не работает.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>
Что хорошо, насколько это идет (если кто-то интересно, я создаю то, что называется Орден Боевого таблицы для Wargame). Но он не продолжает строить весь TreeView. Я думаю, что это просто чтение первого узла и остановка.
Что мне не хватает? Спасибо за помощь. Не стесняйтесь бить меня.
Да, это проблема. Я отредактировал вышеупомянутое сообщение, чтобы показать HierarchicalDataTemplate2.Я подумал (думаю), что я реализовал то, что вы предложили для второго шаблона данных, но «он не подбирает». – zetar
Да, HierarchicalDataTemplates были неправильными ... они были правильными раньше, а затем я изменил их, потому что я идиот. Я вернул их к тому, как они были раньше (что точно так же, как вы указали), но все же только видя первый отображаемый узел. – zetar
@zetar: точно, и это не работает, потому что ваш ItemSource ошибочно настроен на'Commander ', а не, например,'Division' - с его установкой Commander ожидается, что Командиры станут детьми Commander, а это не true в отображаемом xml-фрагменте. –