我尝试通过参考Josh的教程https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode将MVVM应用于树状视图>
这是我的完整源代码
TreeNode.cs
public class TreeNode { private ObservableCollection<TreeNode> _children = new ObservableCollection<TreeNode>(); public ObservableCollection<TreeNode> Children { get { return _children; } set { _children = value; } } public string Name { get; set; } public string ID { get; set; } }
TreeNodeViewModel.cs
public class TreeNodeViewModel : INotifyPropertyChanged { private ObservableCollection<TreeNodeViewModel> _children; private TreeNodeViewModel _seletected; private TreeNodeViewModel _parent; private TreeNode _node; bool _isExpanded; bool _isSelected; public TreeNodeViewModel(TreeNode node) : this(node, null) { } private TreeNodeViewModel(TreeNode node, TreeNodeViewModel parent) { _node = node; _parent = parent; _children = new ObservableCollection<TreeNodeViewModel>( (from child in _node.Children select new TreeNodeViewModel(child, this)) .ToList<TreeNodeViewModel>()); } public ObservableCollection<TreeNodeViewModel> Children { get { return _children; } set { _children = value; } } public string Name { get { return _node.Name; } set { _node.Name = value; } } public TreeNodeViewModel Selected { get { return _seletected; } set { _seletected = value; } } public bool IsExpanded { get { return _isExpanded; } set { if (value != _isExpanded) { _isExpanded = value; this.OnPropertyChanged("IsExpanded"); } // Expand all the way up to the root. if (_isExpanded && _parent != null) _parent.IsExpanded = true; } } public bool IsSelected { get { return _isSelected; } set { if (value != _isSelected) { _isSelected = value; this.OnPropertyChanged("IsSelected"); if (_isSelected) { _seletected = this; } } } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
TreeViewViewModel.cs
public class TreeViewViewModel { readonly ObservableCollection<TreeNodeViewModel> _firstLevel; readonly TreeNodeViewModel _rootNode; private ICommand _addCommand; public TreeViewViewModel(TreeNode rootNode) { _rootNode = new TreeNodeViewModel(rootNode); _firstLevel = new ObservableCollection<TreeNodeViewModel>(_rootNode.Children); _addCommand = new AddCommand(this); } public ObservableCollection<TreeNodeViewModel> FirstLevel { get { return _firstLevel; } } public ICommand AddCommand { get { return _addCommand; } } }
AddCommand.cs
public class AddCommand : ICommand { private TreeViewViewModel _TreeView; public AddCommand(TreeViewViewModel treeView) { _TreeView = treeView; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { //Show Selected item ???? MessageBox.Show(_TreeView.????); } }
我的目标是当我单击添加命令时,它将显示选定的项目名称和父级选定的项目名称。但是问题是TreeViewViewModel中没有任何东西可以访问TreeNodeViewModel。
这被中间类TreeViewViewModel阻止,它生活在Josh的世界中时无法访问TreeNodeViewModel的属性
我尝试通过参考Josh的教程https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode将MVVM应用到树视图中,这是我的完整源代码TreeNode .cs ...
根据我对您之前的问题的评论。将SelectedNode添加到TreeViewViewModel并将其设置在您的Node Selected setter中:
如果您担心应用程序的性能,则始终