0

xsd2code で作成されたオブジェクト階層があります。オブジェクト階層は、タイプ Project のルート オブジェクトで構成されます。このルート オブジェクトには、folder という名前の Folder の ObservableCollection が含まれています。これは、folder という名前の Folder と file という名前の File の ObservableCollection を含む再帰オブジェクトです。このオブジェクト階層を ObjectDataProvider を介して TreeView にバインドし、 HierarchicalDataTemplate 定義による表示

ObjectDataProvider と DataTemplates は、このように App.xaml にマージされたリソースで定義されます

<HierarchicalDataTemplate x:Key="projectTemplate"
    DataType="{x:Type model:Project}"
    ItemsSource="{Binding Path=folder}"                     
    >
    <Grid ToolTip="{Binding Path=Name}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="16" />

            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Image Source="Images/folder_documents_512.ico"  Grid.Column="0"/>
        <TextBlock Grid.Column="1" Margin="6,0,0,0"
        Text="{Binding Path=Name}" 
        />
    </Grid>

</HierarchicalDataTemplate>

<HierarchicalDataTemplate
    DataType="{x:Type model:Folder}"
    ItemsSource="{Binding Path=file}">
    <Grid ToolTip="{Binding Path=name}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="16" />

            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Image Source="Images/folder_vectors_512.ico"  Grid.Column="0"/>
        <TextBlock Grid.Column="1" Margin="6,0,0,0"
        Text="{Binding Path=name}" 
        />
    </Grid>
</HierarchicalDataTemplate>



<DataTemplate
    DataType="{x:Type model:File}">
    <Grid ToolTip="{Binding Path=name}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="16" />

            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Image Source="Images/article-24.png"  Grid.Column="0"/>
        <TextBlock Grid.Column="1" Margin="6,0,0,0"
        Text="{Binding Path=name}" 
        />
    </Grid>
</DataTemplate>


<ObjectDataProvider
    x:Key="project"

   >
</ObjectDataProvider>

TreeView は次のように定義されます

    <TreeView x:Name="tvProject"  
                        ItemsSource="{Binding Source={StaticResource project}}"
            >

グローバル処理は次のとおりです。Xml ファイルからオブジェクト階層を読み込みます (xsd2code 機能)。デバッグでわかるように、オブジェクト階層はきれいです。次に、次のようなコードでオブジェクト階層を ObjectDataProvider にバインドします。

ObjectDataProvider dp = Application.Current.FindResource("project") as ObjectDataProvider;
        dp.ObjectInstance = _project;

さて、TreeView には何も表示されません。何が欠けていますか?

4

1 に答える 1

0

私は私の問題を解決しました、

まず、1 つのオブジェクトだけでなく、コレクションを ObjectDataProvider にバインドする必要がありました。これは ObjectDataProvider の要件ではなく、HierarchicalDataTemplate の要件だと思います。

ObjectDataProvider dp = Application.Current.FindResource("project") as ObjectDataProvider;
ArrayList ocp = new ArrayList();
ocp.Add(_project);
dp.ObjectInstance = ocp;

次に、次のように ItemTemplate プロパティを介して異なる DataTemplates への参照をチェーンする必要がありました。

最初に TreeView で

 <TreeView x:Name="tvProject"  
           ItemsSource="{Binding Source={StaticResource project}}"
           ItemTemplate="{StaticResource projectTemplate}"
                >

そして、別の DataTemplate で

   <DataTemplate x:Key="fileTemplate"
        DataType="{x:Type model:File}">
        <Grid ToolTip="{Binding Path=name}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="16" />

                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Image Source="Images/article-24.png"  Grid.Column="0"/>
            <TextBlock Grid.Column="1" Margin="6,0,0,0"
            Text="{Binding Path=name}" 
            />
        </Grid>
    </DataTemplate>



    <HierarchicalDataTemplate x:Key="folderTemplate"
        DataType="{x:Type model:Folder}"
        ItemsSource="{Binding Path=file}"
        ItemTemplate="{StaticResource fileTemplate}">
        <Grid ToolTip="{Binding Path=name}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="16" />

                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Image Source="Images/folder_vectors_512.ico"  Grid.Column="0"/>
            <TextBlock Grid.Column="1" Margin="6,0,0,0"
            Text="{Binding Path=name}" 
            />
        </Grid>

    </HierarchicalDataTemplate>


    <HierarchicalDataTemplate x:Key="projectTemplate"
        DataType="{x:Type model:Project}"
        ItemsSource="{Binding Path=folder}"  
       ItemTemplate="{StaticResource folderTemplate}"
        >
        <Grid ToolTip="{Binding Path=Name}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="16" />

                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Image Source="Images/folder_documents_512.ico"  Grid.Column="0"/>
            <TextBlock Grid.Column="1" Margin="6,0,0,0"
            Text="{Binding Path=Name}" 
            />
        </Grid>
    </HierarchicalDataTemplate>

今それは動作します

編集

コレクションはさまざまなタイプ (つまり、フォルダーとファイル) を返す可能性があるため、テンプレート セレクターが必要です。

public class FileSystemObjectTemplateSelector : DataTemplateSelector
    {
        public override DataTemplate
            SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement element = container as FrameworkElement;

            if (element != null && item != null && item is FileSystemObject)
            {
                if (item is File)
                    return Application.Current.FindResource("fileTemplate") as DataTemplate;

                if (item is Folder)
                    return Application.Current.FindResource("folderTemplate") as DataTemplate;
            }

            return null;
        }
    }

そしてそれをXAMLで呼び出します

<local:FileSystemObjectTemplateSelector  x:Key="FileSystemObjectTemplateSelector" />

    <HierarchicalDataTemplate x:Key="folderTemplate"
        DataType="{x:Type model:Folder}"
        ItemsSource="{Binding Path=fsObjects, Converter={StaticResource SortFoldersAndFiles}}"
                            ItemTemplateSelector="{StaticResource FileSystemObjectTemplateSelector}" >

    </HierarchicalDataTemplate>
于 2011-03-01T16:10:08.687 に答える