2016-04-05 12 views
0

Ich versuche, auf das TreeViewitem zuzugreifen, das mit HierarchicalDataTemplate basierend auf dem Name der Kopfzeile erstellt wird. Auch ich möchte auf das Steuerelement innerhalb (in diesem Fall Rechteck) das TreeViewitem zugreifen und seine Farbe ändern. Ich habe viele Möglichkeiten ausprobiert, aber keinen Erfolg. Unten ist mein Code. Ich erzeuge Treeview mit benutzerdefinierten Klasse und XML.Zugriff auf TreeViewitem von HierarchicalDataTemplate in WPF

public partial class Window1 : Window 
    { 
     ObservableCollection<Step> TreeViewTemplate; 
     public Window1() 
     { 
      TreeViewTemplate = new ObservableCollection<Step>(); 
      InitializeComponent(); 
      SetDataTemplate("NEWSITECOPPER_PROPOSAL", "Proposal"); 
      tvMain.ItemsSource = TreeViewTemplate; 
      getTreeViewItem(); 

     } 
    private void getTreeViewItem() 
    { 
     TreeViewItem item = (TreeViewItem)(tvMain.ItemContainerGenerator.ContainerFromItem(tvMain.Items[3])); 

    } 

    private void SetDataTemplate(string ProcessName, string journeyName) 
    { 
     try 
     { 
      TreeViewTemplate.Clear(); 
      //XDocument xDoc = XDocument.Load(@"C:\Users\606347769\Desktop\Hemil\Others\TreeView\TreeView\Data.xml"); 
      XDocument xDoc = XDocument.Load(@"C:\Users\606347769\Documents\Visual Studio 2008\Projects\TestAPplication\WpfApplication1\ProcessJourneyCriteria.xml"); 

      var JourneySteps = xDoc.Elements("ProcessAreas").Elements("Process").Where(x => 
       x.Attribute("name").Value == ProcessName).Select(y => 
       y.Elements("Journey").Where(k => k.Attribute("name").Value == journeyName)); 

      var FinalSteps = JourneySteps.FirstOrDefault(); 


      FinalSteps.Elements("Step").ToList<XElement>().ForEach(x => 
      { 
       string key = x.Attribute("name").Value; 
       ObservableCollection<ChildStep> value = new ObservableCollection<ChildStep>(); 
       x.Elements("ChildStep").ToList<XElement>().ForEach(y => 
       { 
        ObservableCollection<GrandChildStep> GC = new ObservableCollection<GrandChildStep>(); 
        y.Elements("GrandChildStep").ToList<XElement>().ForEach(k => 
         { 
          GC.Add(new GrandChildStep { Name = k.Attribute("name").Value }); 
         }); 
        value.Add(new ChildStep { Name = y.Attribute("name").Value, GrandChildStep = GC }); 
       }); 

       TreeViewTemplate.Add(new Step { Name = key, ChildStep = value }); 
      }); 

     } 
     catch (Exception) 
     { 
     } 
    } 
} 

Unten ist die benutzerdefinierte Klasse i

erstellt haben
class Step 
    { 
     public string Name { get; set; } 
     public System.Collections.ObjectModel.ObservableCollection<ChildStep> ChildStep { get; set; } 
    } 

class ChildStep 
{ 
    public string Name { get; set; } 
    public System.Collections.ObjectModel.ObservableCollection<GrandChildStep> GrandChildStep { get; set; } 
} 

class GrandChildStep 
{ 
    public string Name { get; set; } 
} 
+0

Ich habe ein ähnliches Problem bei der Verwendung von HierarchicalDataTemplate konfrontiert. Einfache Lösung ist das Hinzufügen einer isSelected-Eigenschaft und das Binden an isSelected-Eigenschaft von treeviewItem, wenn Sie den Knoten in UI auswählen. Bitte sagen Sie mir, wie Sie den Namen der Kopfzeile bekommen. Ist es auf Klick auf den Knoten? – Kumar

Antwort

0

Sie sollten alles, was Sie auf Ihrem (Ansicht) Modell zugreifen möchten aussetzen und nur daran binden, wie die Background der Form oder der IsSelected Eigenschaft des Artikels (muss in ItemContainerStyle gebunden sein).

Wenn Sie in WPF auf "UI-Steuerelemente" zugreifen müssen, tun Sie normalerweise etwas falsch.

0

benennen Sie das Kind, für zB. in Ihrem Fall x: Name = "Rect" dann erklären diese Hilfsmethode in Ihrem Code Rechteck

T GetVisualChild<t>(DependencyObject parent, string name) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<t>(v, name); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 

dann

nur Rectangle Rect=new Rectangle(); in Konstruktor oder geladenem Ereignisse deklariert.

und wenn Sie auf das Kind zugreifen möchten. Verwenden Sie diese deklarierte Hilfsmethode. für z.

Hinweis: Hier ist "treeview" der Name des übergeordneten Elements Sie können den Namen des übergeordneten Elements angeben, das direkt auf das untergeordnete Element zugreift.

Verwandte Themen