【问题标题】:TreeView, ObjectDataProvider, HierarchicalDataTemplate, xsd2Code not showing anythingTreeView、ObjectDataProvider、HierarchicalDataTemplate、xsd2Code 未显示任何内容
【发布时间】:2011-02-28 23:31:55
【问题描述】:

我有一个用 xsd2code 创建的对象层次结构。对象层次结构 由 Project 类型的根对象组成,其中包含 ObservableCollection 名为文件夹的文件夹,它是一个包含 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 中什么也没有出现。 我错过了什么?

【问题讨论】:

    标签: wpf treeview hierarchicaldatatemplate objectdataprovider


    【解决方案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>
    

    现在可以了

    编辑

    因为 Collection 可以返回不同的类型(即文件夹和文件) 你需要一个模板选择器

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多