【问题标题】:WPF Treeview Binding, HOw do i display different data class as a Nodes Child?WPF Treeview 绑定,我如何将不同的数据类显示为节点子项?
【发布时间】:2010-09-24 18:13:20
【问题描述】:

我试图在 WPF Treeview 中显示一个组(文件扩展名和图标)(父级),然后显示该组(子级)中找到的所有文件。我可以让组显示在树视图中,每个组都有一个图标和文本,但是我不明白如何将文件显示为组的子级。这是 GroupInfo 类,问题是它包含 FileInfo 一个不同的类,到目前为止我在 WPF treeview 上阅读的所有教程都只使用一个数据类来创建树项:

public class GroupInfo
{
    public GroupInfo()
    {
        alFiles = new ObservableCollection<FileInfo>();
    }

    public string strExtension { get; set; }
    public ImageSource icon {get; set;}
    public string strDescription { get; set; }

    public string TypeDescription 
    {
        get
        {
            string s = strExtension;
            s.Replace('.',' ');
            s += " - " + strDescription;
            return s;
        }

        set
        {

        }
    }

    public ObservableCollection<FileInfo> alFiles;

    void LoadIcon()
    {
        //icon = BitmapFrame.Create();
    }

    string GetDescription()
    {
        string strD = "";

        return strD;
    }
}

我希望能够将 alFiles 中的所有 FileInfo 类显示为组节点的子节点。这是我的 XAML:

<TreeView Margin="12,12,12,375" Name="trGroups" ItemsSource="{Binding Groups}" >
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:GroupInfo}" 
                              ItemsSource="{Binding Groups}">
                <StackPanel Orientation="Horizontal" Margin="2">
                <Image Source="{Binding icon}"
                    Width="16" 
                   Height="16" 
                   SnapsToDevicePixels="True"/>
                    <TextBlock Text="{Binding TypeDescription}" Margin="5,0"/>

                </StackPanel>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:FileInfo}" 
                              ItemsSource="{Binding Groups.Files}">
                <StackPanel Orientation="Horizontal" Margin="2">
                    <Image Source="{Binding icon}"
                    Width="16" 
                   Height="16" 
                   SnapsToDevicePixels="True"/>
                    <TextBlock Text="{Binding TypeDescription}" Margin="5,0"/>

                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

提前谢谢....

【问题讨论】:

    标签: .net wpf binding


    【解决方案1】:

    一些事情。首先,在您的 GroupInfo 类中,您应该为您的 alFiles 字段定义一个属性。这样它就可以与 Bindings 一起使用。

    public ObservableCollection<FileInfo> alFiles;
    public ObservableCollection<FileInfo> AlFiles { get { return alFiles;} }
    

    接下来,在 GroupInfo 的 HierarchicalDataTemplate 中,应将 ItemsSource 设置为 AlFiles 属性。

    <HierarchicalDataTemplate DataType="{x:Type local:GroupInfo}" 
                                  ItemsSource="{Binding AlFiles}">
    

    最后,除非 FileInfo 类中包含您希望出现在 TreeView 中的子项,否则您可能希望将其模板更改为 &lt;DataTemplate&gt; 而不是 &lt;HierarchicalDataTemplate&gt;

    <DataTemplate DataType="{x:Type local:FileInfo}">
    ...                
    </DataTemplate>
    

    希望这会有所帮助。

    【讨论】:

    • 非常感谢运行良好的 karmicpuppet。我已经在 Win32/MFC/Windows 窗体中编程多年,但我决定使用 WPF 编写我的下一个应用程序,因此我正在学习使用每个控件。那么让我来做对了,对于每个子节点,您需要一个 定义数据类型和 itemsource,是吗?
    • 我不确定我是否理解您的问题。但本质上,对于要在树视图中显示的每种分层数据类型,您必须为其定义一个 HierarchicalDataTemplate,其 ItemsSource 设置为 Children 集合。
    • 例如,您有一个带有订单集合的客户对象。每个 Order 对象都有一个 Items 集合。在这种情况下,您将需要两个分层数据模板来在树视图中显示:一个用于 Customer 类(其中 ItemsSource={Binding Orders}),一个用于 Order 类(其中 ItemsSource={Binding Items})。 Item 类可以简单地用一个普通的 DataTemplate 来表示。希望这会有所帮助。
    • 啊,谢谢你,这正是我的意思,抱歉写得不好。你已经完美地回答了我的问题,我让树完全按照我的意愿工作。我确实喜欢 WPF 绑定,最后使用一些智能用户界面控件(我讨厌 UI 编程,但 WPF 可能会改变这一点)。
    • 很高兴知道。是的,WPF 是一个很棒的框架,但是,是的,我不得不说它带有相当陡峭的学习曲线。但使用起来非常有益。所以,祝你好运! (对了,你能接受我上面的回答吗?谢谢。)
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多