ダイアログとして開いているウィンドウにTreeViewがあります。アイテムをクリックすると、そのアイテムが選択されます。ただし、サービスコールがあると、選択したアイテムがルートアイテムに変わります。TreeViewのDataContextは「作成者」の配列であり、それぞれに「ページ」の配列を含む「本」の配列が含まれています。サービス呼び出しから「作成者」の配列と「ページ」PDFのバイトを取得します。「著者」と「本」はTreeViewに表示されますが、「ページ」は表示されません。「本」をクリックすると、「ページ」の配列がコンボボックスにロードされ、最初の「ページ」がPDFビューアに表示されます。「ページ」は、サービス呼び出しによってサーバーからロードされます。ルートの「作成者」
注:これは私が実際に使用しているコードですが、会社のプライバシーポリシーにより、名前が変更されています。ただし、機能的にも構造的にもすべて同じです。
基本的に、XAMLとコードビハインドは次のとおりです。
XAML:
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:author}" ItemsSource="{Binding Path=books}">
<TextBlock Text="{Binding name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:book}" >
<TextBlock Text="{Binding title}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" MinWidth="125"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<GridSplitter HorizontalAlignment="Right" VerticalAlignment="Stretch" Grid.Column="1" Grid.RowSpan="2" ResizeBehavior="PreviousAndNext" Width="5" Background="#FFBCBCBC"/>
<TreeView x:Name="booksTreeView" Grid.Column="0" Grid.RowSpan="2" SelectedItemChanged="booksTreeView_SelectedItemChanged" Background="WhiteSmoke"/>
<ComboBox x:Name="pagesDropBox" Grid.Column="2" Grid.Row="0" HorizontalAlignment="Left" MinWidth="100" SelectionChanged="pagesDropBox_SelectionChanged" />
<Grid Grid.Column="2" Grid.Row="1" x:Name="previewHolderGrid"/>
</Grid>
C#:
private void booksTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeView tree = sender as TreeView;
book b = tree.SelectedItem as book;
if (b != null)
{
e.Handled = true;
pagesDropBox.ItemsSource = db.pages;
if (b.pages.Count > 0)
pagesDropBox.SelectedIndex = 0;
}
}
private void pagesDropBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
previewHolderGrid.Children.Clear();
Guid p = pagesDropBox.SelectedItem as Guid;
if (p != Guid.Empty)
{
byte[] bytes = ServiceAccess.Instance.GetPage(p); //This is the line that will cause the root item to be selected even if the next line is commented out
this.previewHolderGrid.Children.Add(new PDFViewer.PdfViewerControl(bytes));
}
}
データコンテキストオブジェクト:
public class author{
String name;
BindingList<book> books;
}
public class book{
String title;
BindingList<Guid> pages;
}