首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeView,ObjectDataProvider,HierarchicalDataTemplate,xsd2Code什么都没展示

TreeView,ObjectDataProvider,HierarchicalDataTemplate,xsd2Code什么都没展示
EN

Stack Overflow用户
提问于 2011-02-28 23:31:55
回答 1查看 1.2K关注 0票数 0

我有一个用xsd2code创建的对象层次结构。对象层次结构由类型为Project的根对象组成,它包含名为ObservableCollection的文件夹,这是一个递归对象,包含文件夹命名的ObservableCollection和文件命名的文件,我希望通过ObjectDataProvider将该对象层次结构绑定到TreeView,并通过HierarchicalDataTemplate定义控制显示

ObjectDataProvider和DataTemplates在App.xaml中合并的资源中定义,如下所示

代码语言:javascript
复制
<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的定义如下

代码语言:javascript
复制
    <TreeView x:Name="tvProject"  
                        ItemsSource="{Binding Source={StaticResource project}}"
            >

全局处理是:我从Xml文件(xsd2code功能)加载对象层次结构。正如我在调试中所看到的,我的对象层次结构是干净的。然后,在代码中将对象层次结构绑定到ObjectDataProvider,如下所示

代码语言:javascript
复制
ObjectDataProvider dp = Application.Current.FindResource("project") as ObjectDataProvider;
        dp.ObjectInstance = _project;

嗯,TreeView里什么也没有出现。我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2011-03-01 16:10:08

我解决了我的问题

首先,我必须将一个集合绑定到ObjectDataProvider,而不仅仅是一个对象。我不认为这是ObjectDataProvider的要求,但更多的是HierarchicalDataTemplate的要求。

代码语言:javascript
复制
ObjectDataProvider dp = Application.Current.FindResource("project") as ObjectDataProvider;
ArrayList ocp = new ArrayList();
ocp.Add(_project);
dp.ObjectInstance = ocp;

然后,我不得不通过这样的DataTemplates属性将引用链接到不同的ItemTemplate:

TreeView上的第一个

代码语言:javascript
复制
 <TreeView x:Name="tvProject"  
           ItemsSource="{Binding Source={StaticResource project}}"
           ItemTemplate="{StaticResource projectTemplate}"
                >

然后在不同的DataTemplate中

代码语言:javascript
复制
   <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>

现在起作用了

编辑

由于Collection可以返回不同类型(即文件夹和文件),所以需要一个模板选择器

代码语言:javascript
复制
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中的调用

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5148856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档