设置HierarchicalDataTemplate WPF

时间:2016-04-21 09:39:48

标签: c# wpf dialog treeview hierarchicaldatatemplate

我有以下TreeView

<TreeView x:Name="Folders" Grid.Column="0" SelectedItemChanged="Folders_SelectedItemChanged" ItemsSource="{Binding Items}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type Local:OpenFolderItem}" ItemsSource="{Binding Children}" >
            <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch" Margin="0,2,0,2">
                <Image Source="{Binding Path=Image, Mode=OneTime}" Stretch="Fill" />
                <TextBlock Text="{Binding Name}" Margin="5,0" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

在代码隐藏中,我想更改根目录,以便它自动扩展到该目录。

例如:

下图显示了打开对话框时会发生什么:

enter image description here

说我希望从目录开始:“E:\ Sequences”,当我启动对话框时,我希望它看起来像这样:

enter image description here

这是VM:

更新1

    public class OpenFolderItem : ViewModelBase
    {
        #region Private Members

        private string m_path;
        ICollection<OpenFolderItem> m_children;
        bool m_isSelected;

        #endregion Private Members

        #region Constructors

        public OpenFolderItem() { }
        public OpenFolderItem(string path) { Path = path; }

        #endregion

        #region Properties

        public bool IsExpanded { get; set; }
        public string Name { get; set; }

        public string Path
        {
            get
            {
                return m_path;
            }
            set
            {
                m_path = value;
            }
        }
        public ImageSource Image { get; set; }
        public virtual ICollection<OpenFolderItem> Children
        {
            get { return m_children ?? (m_children = LoadChildren()); }
            set { m_children = value; }
        }

        #endregion Properties

        #region Private Functions

        private ICollection<OpenFolderItem> LoadChildren()
        {
            var items = new List<OpenFolderItem>();
            try
            {
                items.AddRange(Directory.GetDirectories(Path).Select(directory => new OpenFolderItem(directory)
                {
                    Name = System.IO.Path.GetFileName(directory),
                    Image = FileInfoHelper.GetFolderImage(false),
                    IsExpanded =  true
                }));

                items = items.OrderBy(o => o.Path , new Comparer.NaturalStringComparer()).ToList();
            }
            catch (UnauthorizedAccessException) { }
            catch (ArgumentException) { }
            catch (DirectoryNotFoundException) { }

            return new ReadOnlyCollection<OpenFolderItem>(items);
        }

        #endregion Private Functions
    }

这是 Xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace OpenDialogs
{
    /// <summary>
    /// Interaction logic for OpenDialogView.xaml
    /// </summary>
    public partial class OpenDialogView
    {
        #region Private Members

        private Window m_window;

        #endregion Private Members

        #region Constructor

        /// <summary>
        /// The OpenDialogView's constructor.
        /// </summary>
        public OpenDialogView()
        {
            InitializeComponent();
        }

        #endregion Constructor

        #region Properties

        public string IconFile { get; set; }

        #endregion Properties

        #region Private Functions

        private void Folders_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            ViewModel.SelectedFolder = e.NewValue as OpenFolderItem;
        }
        private void OnShow(object sender, OpenDialogEventArgs e)
        {  
            try
            {
                //var b = new OpenFolderItem();
                //b.Name = "Sequences";
                //b.Path = @"E:\Sequences";
                //ViewModel.SelectedFolder = b;

                //ItemCollection ic = Folders.Items;
                //string yourNode = "Sequences";

                //foreach (TreeViewItem tvi in ic)
                //{
                //    if (yourNode.StartsWith(tvi.Tag.ToString()))
                //    {
                //        tvi.IsExpanded = true;
                //        break;
                //    }
                //}

                m_window = new Window
                {
                    Content = this,
                    SizeToContent = SizeToContent.Manual,
                    ResizeMode = ResizeMode.CanResizeWithGrip,
                    WindowStyle = WindowStyle.SingleBorderWindow,
                    Title = e.Caption,
                    ShowInTaskbar = false,
                    Topmost = true,
                    Height = 600,
                    Width = 1000,
                    Owner = e.Owner,
                    WindowStartupLocation = e.StartupLocation,
                };

                if (!String.IsNullOrEmpty(IconFile))
                    m_window.Icon = BitmapFrame.Create(new Uri("pack://application:,,,/" + IconFile, UriKind.RelativeOrAbsolute));

                m_window.ShowDialog();
            }
            catch (Exception)
            {
                Console.WriteLine();
            }      
        }
        private void OnClose(object sender, OpenDialogEventArgs e)
        {
            m_window.Close();
        }

        #endregion Private Functions
    }
}

我很确定我被'HierarchicalDataTemplate'阻止了。那是对的吗?有什么方法可以使它发挥作用吗?

1 个答案:

答案 0 :(得分:0)

您必须遍历节点并将必要的节点IsExpanded属性设置为true。

在mainWindow.xaml.cs中尝试此代码:

public MainWindow()
{
   InitializeComponent();
   ExtendTree();
}

private void ExtendTree()
{

    ItemCollection ic = treeView.Items;
    string yourNode = "Sequences";

    foreach (var tvi in ic)
    {
       if (yourNode.StartsWith((TreeViewItem)tvi.Tag.ToString()))
       {
          (TreeViewItem)tvi.IsExpanded = true;
          break;
       }
     }
}