2016-04-05 15 views
0

ヘッダーの名前に基づいてHierarchicalDataTemplateを使用して作成されたtreeviewitemにアクセスしようとしています。また、私はtreeviewitem内部のコントロール(この場合は長方形)にアクセスし、その色を変更したいと思います。私は多くの方法を試みたが成功しなかった。以下は私のコードです。私はカスタムクラスとXMLを使用してTreeviewを生成しています。以下はWPFのHierarchicalDataTemplateからtreeviewitemにアクセス

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) 
     { 
     } 
    } 
} 

あなたは形状のBackgroundなど、あなたの(ビュー)モデルにアクセスし、それにバインドしたいすべてのものを、公開する必要があります私は

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

HierarchicalDataTemplateの使用中に同様の問題が発生しました。 単純な解決策は、isSelectedプロパティを追加し、UIにノードを選択しているときにtreeviewItemのisSelectedプロパティです。 ヘッダーの名前をどのように取得しているか教えてください。ノードをクリックしていますか? – Kumar

答えて

0

を作成したカスタムクラスでありますIsSelectedアイテムのプロパティ(ItemContainerStyleにバインドする必要があります)。

WPFで「UIコントロールにアクセスする」必要がある場合は、通常何か間違っています。

0

名前子供、例えば、あなたのケースでは、Xは:名= "のRect" その後、 を長方形に続い

だけコンストラクタまたはロードされたイベントでRectangle Rect=new Rectangle();を宣言し、あなたのコード

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; 
    } 
で、このヘルパーメソッドを宣言します。

子供にアクセスしたいとき。宣言されたヘルパーメソッドを使用します。たとえば。

Rect=GetVisualChild<treeview>(this, "Rect") 

注:ここで「treeview」は親の名前です。子に直接アクセスする親の名前を与えることができます。

関連する問題