求问WPF的MVVM模式下如何获得被选中树节点的父节点

opencv_newers 2019-06-18 04:40:49
求问WPF的MVVM模式下如何获得被选中树节点的父节点
var node = this.Tree.SelectedItem as Node;
。。。
。。。
...全文
380 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2019-06-19
  • 打赏
  • 举报
回复
首先一般树形接口在设置值的时候都是递归处理的,在递归方法中可以设置当前对象的属性和其父节点对象;
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
引用 13 楼 E次奥 的回复:
[quote=引用 12 楼 opencv_newers 的回复:] [quote=引用 11 楼 exception92 的回复:] [quote=引用 8 楼 opencv_newers 的回复:] [quote=引用 4 楼 exception92 的回复:] 选中树节点的父节点 ->操作数据源比较方便的,想通过操作UI来获取不提倡。
请问如何操作Node这个数据源?[/quote] 你需要在绑定数据源的时候就确定好node之间的关系,也就是node类中必须包含一个node父类对象,表示该node的父node。[/quote] 这是我写的节点构造函数,我不知道如何在构造函数中表示该节点的父节点 private ObservableCollection<Node> children; public ObservableCollection<Node> Children { get { return children; } set { children = value; OnPropertyChanged("Children"); } } private Node parent; public Node Parent { get { return parent; } set { parent = value; OnPropertyChanged("Parent"); } } public Node() { Children = new ObservableCollection<Node>(); }[/quote] 你这里吧Parent不就是父节点的数据么?难道你需要父节点的TreeViewItem?[/quote]
引用 13 楼 E次奥 的回复:
[quote=引用 12 楼 opencv_newers 的回复:] [quote=引用 11 楼 exception92 的回复:] [quote=引用 8 楼 opencv_newers 的回复:] [quote=引用 4 楼 exception92 的回复:] 选中树节点的父节点 ->操作数据源比较方便的,想通过操作UI来获取不提倡。
请问如何操作Node这个数据源?[/quote] 你需要在绑定数据源的时候就确定好node之间的关系,也就是node类中必须包含一个node父类对象,表示该node的父node。[/quote] 这是我写的节点构造函数,我不知道如何在构造函数中表示该节点的父节点 private ObservableCollection<Node> children; public ObservableCollection<Node> Children { get { return children; } set { children = value; OnPropertyChanged("Children"); } } private Node parent; public Node Parent { get { return parent; } set { parent = value; OnPropertyChanged("Parent"); } } public Node() { Children = new ObservableCollection<Node>(); }[/quote] 你这里吧Parent不就是父节点的数据么?难道你需要父节点的TreeViewItem?[/quote] 我只是申明了这个变量,但是你要在构造函数把parent组织关联起来。
E次奥 2019-06-19
  • 打赏
  • 举报
回复
引用 12 楼 opencv_newers 的回复:
[quote=引用 11 楼 exception92 的回复:]
[quote=引用 8 楼 opencv_newers 的回复:]
[quote=引用 4 楼 exception92 的回复:]
选中树节点的父节点
->操作数据源比较方便的,想通过操作UI来获取不提倡。

请问如何操作Node这个数据源?[/quote]
你需要在绑定数据源的时候就确定好node之间的关系,也就是node类中必须包含一个node父类对象,表示该node的父node。[/quote]
这是我写的节点构造函数,我不知道如何在构造函数中表示该节点的父节点
private ObservableCollection<Node> children;
public ObservableCollection<Node> Children
{
get
{
return children;
}
set
{
children = value;
OnPropertyChanged("Children");
}
}

private Node parent;
public Node Parent
{
get
{
return parent;
}
set
{
parent = value;
OnPropertyChanged("Parent");
}
}
public Node()
{
Children = new ObservableCollection<Node>();

}[/quote]

你这里吧Parent不就是父节点的数据么?难道你需要父节点的TreeViewItem?
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
引用 11 楼 exception92 的回复:
[quote=引用 8 楼 opencv_newers 的回复:] [quote=引用 4 楼 exception92 的回复:] 选中树节点的父节点 ->操作数据源比较方便的,想通过操作UI来获取不提倡。
请问如何操作Node这个数据源?[/quote] 你需要在绑定数据源的时候就确定好node之间的关系,也就是node类中必须包含一个node父类对象,表示该node的父node。[/quote] 这是我写的节点构造函数,我不知道如何在构造函数中表示该节点的父节点 private ObservableCollection<Node> children; public ObservableCollection<Node> Children { get { return children; } set { children = value; OnPropertyChanged("Children"); } } private Node parent; public Node Parent { get { return parent; } set { parent = value; OnPropertyChanged("Parent"); } } public Node() { Children = new ObservableCollection<Node>(); }
exception92 2019-06-19
  • 打赏
  • 举报
回复
引用 8 楼 opencv_newers 的回复:
[quote=引用 4 楼 exception92 的回复:]
选中树节点的父节点
->操作数据源比较方便的,想通过操作UI来获取不提倡。

请问如何操作Node这个数据源?[/quote]
你需要在绑定数据源的时候就确定好node之间的关系,也就是node类中必须包含一个node父类对象,表示该node的父node。
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
引用 6 楼 hez2010 的回复:
通过 VisualizationTree 可以查找到父节点
因为我的树是绑定数据源的,我想得到的是控件绑定的对象。
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
忘记加了一个这个 public Node() { Children = new ObservableCollection<Node>(); }
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
引用 4 楼 exception92 的回复:
选中树节点的父节点 ->操作数据源比较方便的,想通过操作UI来获取不提倡。
请问如何操作Node这个数据源?
正怒月神 2019-06-19
  • 打赏
  • 举报
回复
一般就2个办法,。 第一个楼上已经说了,再到数据源根据parentID查询父对象 第二个是,在你生成Node的时候,做成双向链表的样子,把Node的前驱和后驱全部设定好。
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
引用 5 楼 OrdinaryCoder 的回复:
你既然可以取到当前节点 用整个树的数据源查一下 看哪个节点的子节点是你这个节点 不就能取到父节点了吗
感谢你提供的思路
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
我已经做出来了,但是复杂度很高,这个一共四个层级结构,我用了三个循环,有哪位大神愿意改进一下吗,附上代码 public Node GetParentNode(Node selectednode) { Node rootnode = children[0]; //根节点已知 foreach(var node1 in rootnode.Children) { if (node1 == selectednode) { return rootnode; } else { foreach(var node2 in node1.Children) { if (node2 == selectednode) { return node1; } else { foreach(var node3 in node2.Children) { if (node3 == selectednode) { return node2; } } } } } } return null; }
opencv_newers 2019-06-19
  • 打赏
  • 举报
回复
引用 15 楼 E次奥 的回复:
首先一般树形接口在设置值的时候都是递归处理的,在递归方法中可以设置当前对象的属性和其父节点对象;
public Node GetParentNode(Node selectednode) { Node nodeparent = new Node(); while(!nodeparent.Children.Contains(selectednode)) { ....; return ; } } 提供下思路呗,具体怎么写
lionheart922 2019-06-18
  • 打赏
  • 举报
回复
既然是MVVM了,就尽量不要直接访问树,能用绑定尽量用绑定。
hez2010 2019-06-18
  • 打赏
  • 举报
回复
通过 VisualizationTree 可以查找到父节点
OrdinaryCoder 2019-06-18
  • 打赏
  • 举报
回复
你既然可以取到当前节点 用整个树的数据源查一下 看哪个节点的子节点是你这个节点 不就能取到父节点了吗
exception92 2019-06-18
  • 打赏
  • 举报
回复
选中树节点的父节点 ->操作数据源比较方便的,想通过操作UI来获取不提倡。
opencv_newers 2019-06-18
  • 打赏
  • 举报
回复
附上代码,这是Node类 public class Node : INotifyPropertyChanged { private string nodeName; public string NodeName { get { return nodeName; } set { nodeName = value; OnPropertyChanged("NodeName"); } } private bool isExpanded; public bool IsExpanded { get { return isExpanded; } set { isExpanded = value; OnPropertyChanged("IsExpanded"); } } private bool isSelected; public bool IsSelected { get { return isSelected; } set { isSelected = value; OnPropertyChanged("IsSelected"); } } private ObservableCollection<Node> children; public ObservableCollection<Node> Children { get { return children; } set { children = value; OnPropertyChanged("Children"); } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
opencv_newers 2019-06-18
  • 打赏
  • 举报
回复
要的是父节点绑定后的对象
opencv_newers 2019-06-18
  • 打赏
  • 举报
回复

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧