1

ダイアログとして開いているウィンドウに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;
}
4

0 に答える 0