【问题标题】:Access treeviewitem from HierarchicalDataTemplate in WPF从 WPF 中的 HierarchicalDataTemplate 访问 treeviewitem
【发布时间】:2016-04-06 14:06:28
【问题描述】:

我正在尝试根据标题的名称访问使用 HierarchicalDataTemplate 创建的树视图项。我还想访问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; }
}

【问题讨论】:

  • 我在使用 HierarchicalDataTemplate 时遇到了类似的问题。简单的解决方案是添加一个 isSelected 属性并将其绑定到 treeviewItem 的 isSelected 属性,以防您在 UI 中选择节点。请告诉我你是如何获得标题的名称的。是点击节点吗?

标签: wpf hierarchicaldatatemplate


【解决方案1】:

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

如果您需要在 WPF 中“访问 UI 控件”,您通常会做错事。

【讨论】:

    【解决方案2】:

    给孩子起名字,例如。在你的情况下 x:Name="Rect" 到 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;
        }
    

    然后

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

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

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

    注意:这里的“treeview”是父母的名字你可以直接给访问孩子的父母的名字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2016-08-23
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多