none
请问如何处理TreeView的节点不是TreeViewItem的情况 RRS feed

  • 问题

  • 我想用TreeView加载一个目录结构,每一个节点需要保存文件(或文件夹)名,完整路径,打开该文件的默认程序。因此我用一个类来保存这些信息。

    public class TreeNodeItem : INotifyPropertyChanged

    {

            public TreeNodeItem() {}

            string showText;

            public string ShowText

            {

                get { return showText; }

                set

                {

                    if (showText == value) return;

                    showText = value;

                    Notify("ShowText");

                }

            }

            string fullPath;

            public string FullPath

            {

                get { return fullPath; }

                set

                {

                    if (fullPath == value) return;

                    fullPath = value;

                    Notify("FullPath");

                }

            }

            string startWithProgram;

            public string StartWithProgram

            {

                get { return startWithProgram; }

                set

                {

                    if (startWithProgram == value) return;

                    startWithProgram = value;

                    Notify("StartWithProgram");

                }

            }

            public event PropertyChangedEventHandler PropertyChanged;

            protected void Notify(string propName)

            {

                if (PropertyChanged != null)

                {

                    PropertyChanged(this, new PropertyChangedEventArgs(propName));

                }

            }

        }

    把TreeNodeItem类的对象作为节点添加到TreeView

    TreeViewItem tvi = treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem) as         TreeViewItem;

    tvi.Items.Add(new TreeNodeItem());

    但是这样对节点深度超过1的就不管用了,请问对于这种情况,能不能把节点作为TreeViewItem用啊?

    2010年9月15日 2:39

答案

  • 研究了几天,终于有答案了,拿出来和大家共享下

    为TreeNodeItem类写一个集合类,然后分别绑定到TreeView就行了,如下:

    public class TreeNodeList : ObservableCollection<TreeNodeItem> {}

    然后在xaml中用层次绑定

     

    <HierarchicalDataTemplate DataType="{x:Type local:TreeNodeList }">

    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type TreeNodeItem}"

                                               ItemsSource="{Binding Path=SubCategories}">

          <TextBlock Text="{Binding Path=CategoryID}" />

    </HierarchicalDataTemplate>

    如此,操作TreeView的SelectedItem和TreeNodeList类的对象,就可以达到目的了。

     

    • 已标记为答案 飞羽 2010年9月19日 5:08
    2010年9月19日 5:08

全部回复

  • 这个问题有没有解啊?从TreeViewItem派生好像是不行的。
    2010年9月16日 5:20
  • 研究了几天,终于有答案了,拿出来和大家共享下

    为TreeNodeItem类写一个集合类,然后分别绑定到TreeView就行了,如下:

    public class TreeNodeList : ObservableCollection<TreeNodeItem> {}

    然后在xaml中用层次绑定

     

    <HierarchicalDataTemplate DataType="{x:Type local:TreeNodeList }">

    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type TreeNodeItem}"

                                               ItemsSource="{Binding Path=SubCategories}">

          <TextBlock Text="{Binding Path=CategoryID}" />

    </HierarchicalDataTemplate>

    如此,操作TreeView的SelectedItem和TreeNodeList类的对象,就可以达到目的了。

     

    • 已标记为答案 飞羽 2010年9月19日 5:08
    2010年9月19日 5:08