2016-04-21 15 views
0

Ich habe folgendes TreeView:Einstellung Stammordner HierarchicalDataTemplate WPF

<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> 

Im Code-behind, würde Ich mag das Stammverzeichnis ändern, so dass es automatisch erweitert in dieses Verzeichnis.

Zum Beispiel:

Das folgende Bild zeigt, was passiert, wenn ich einen Dialog:

enter image description here

sagt, dass ich mit dem Verzeichnis starten will: "E: \ Sequences", wenn ich starten sie den Dialog, möchte ich es wie folgt aussehen:

enter image description here

Hier wird die VM ist:

aktualisieren 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 
    } 

Und hier ist die 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 
    } 
} 

Ich bin mir ziemlich sicher, dass ich von der 'HierarchicalDataTemplate' blockiert. Ist das korrekt? Irgendeine Möglichkeit, es zum Laufen zu bringen?

+0

wo Ihre 'Elemente' auf 'TreeView' Sammlung binded? – StepUp

Antwort

0

Sie müssten die Knoten durchlaufen und die erforderlichen IsExpanded Eigenschaften auf true setzen.

diesen Code in mainWindow.xaml.cs Versuchen:

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; 
     } 
    } 
} 
+0

Das Problem ist, dass meine Elemente nicht 'TreeViewItems' sind sie' OpenFolderItem'. Diese Klasse hat keine 'IsExpanded' Eigenschaft, also habe ich sie manuell hinzugefügt. Die Sache ist, dass ich nicht weiß, was oder wie man Boolean bindet. Ich habe meinen Beitrag mit dem Code der 'OpenFolderItem' Klasse aktualisiert. – Idanis

+0

@Idanis bitte, siehe meine aktualisierte Antwort. Lassen Sie mich wissen, ob Sie Fragen haben – StepUp

+0

Funktioniert immer noch nicht .... Meine 'ItemCollection' enthält eine Liste von' OpenFolderItem' und nicht 'TreeViewItem', so dass eine Ausnahme ausgelöst wird, wenn das Casting online durchgeführt wird:' if (yourNode.StartsWith ((TreeViewItem) tvi.Tag.ToString())) ' – Idanis