从WPF中的HierarchicalDataTemplate访问treeviewitem

时间:2016-04-05 03:55:12

标签: wpf hierarchicaldatatemplate

我正在尝试访问基于标题名称使用HierarchicalDataTemplate创建的treeviewitem。此外,我想访问treeviewitem内部的控件(在本例中为矩形)并更改其颜色。我尝试了很多方法但没有成功。以下是我的代码。我正在使用自定义类和xml生成Treeview。

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

以下是我创建的自定义类

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

2 个答案:

答案 0 :(得分:0)

您应该在(视图)模型上公开您想要访问的所有内容,然后绑定到它,例如形状的Background或项目的IsSelected属性(需要绑定到ItemContainerStyle)。

如果您需要&#34;访问UI控件&#34;在WPF中,你通常做错了。

答案 1 :(得分:0)

为孩子命名,例如。在你的情况下x:Name =&#34; Rect&#34;到矩形 然后 在你的代码中声明这个帮助方法

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

然后

只在构造函数或加载的事件中声明Rectangle Rect=new Rectangle();

当您想要访问孩子时。使用声明的辅助方法。例如。

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

注意:这里&#34; treeview&#34;是父母的名字您可以直接给出访问孩子的父母的姓名。