C# 如何将TreeView项添加到TreeView控件
这个问题是问题的后续问题。我从这个网站上得到了一些建议,并决定开始学习如何使用TreeViews实现我的工作。尽管如此,我对MVVM还是很陌生,而且我仍然对语法和实现很熟悉 我有一个显示整型数据的树状视图,但我希望它能处理字符串。该树还允许用户通过选择TreeViewItem,然后在文本框中键入新的整数标题,然后单击按钮来添加到任何级别 我想让父母、孩子和孙子在创业时都有预定义的名字。另一件需要注意的事情是,该用户只能在子级添加到树视图(因此他们只能添加孙子) 型号C# 如何将TreeView项添加到TreeView控件,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,这个问题是问题的后续问题。我从这个网站上得到了一些建议,并决定开始学习如何使用TreeViews实现我的工作。尽管如此,我对MVVM还是很陌生,而且我仍然对语法和实现很熟悉 我有一个显示整型数据的树状视图,但我希望它能处理字符串。该树还允许用户通过选择TreeViewItem,然后在文本框中键入新的整数标题,然后单击按钮来添加到任何级别 我想让父母、孩子和孙子在创业时都有预定义的名字。另一件需要注意的事情是,该用户只能在子级添加到树视图(因此他们只能添加孙子) 型号 public class
public class TreeViewModel : PropertyChangedBase
{
public string Value { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public CollectionView ItemsView { get; set; }
public TreeViewModel(string value)
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items)
{
SortDescriptions =
{
new SortDescription("Value",ListSortDirection.Ascending)
}
};
Value = value;
}
}
public class SortedTreeViewWindowViewModel : PropertyChangedBase
{
private string _newValueString;
public string NewValueString
{
get { return _newValueString; }
set
{
_newValueString = value;
OnPropertyChanged("NewValueString");
}
}
public TreeViewModel SelectedItem { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public ICollectionView ItemsView { get; set; }
public SortedTreeViewWindowViewModel()
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items) { SortDescriptions = { new SortDescription("Value", ListSortDirection.Ascending) } };
}
public void AddNewItem()
{
ObservableCollection<TreeViewModel> targetcollection;
//Insert the New Node as a Root node if nothing is selected.
targetcollection = SelectedItem == null ? Items : SelectedItem.Items;
if (_newValueString != null)
{
targetcollection.Add(new TreeViewModel(_newValueString));
NewValueString = string.Empty;
}
}
}
namespace TreeViewExample
{
using System.Collections.ObjectModel;
using System.Windows.Controls;
class MainWindowViewModel
{
public ObservableCollection<TreeViewItem> Tree { get; set; }
public MainWindowViewModel()
{
Tree = new ObservableCollection<TreeViewItem>();
Tree.Add(GetLoadedTreeRoot());
}
private TreeViewItem GetLoadedTreeRoot()
{
TreeViewItem parent = new TreeViewItem() { Header = "Parent" };
TreeViewItem child1 = new TreeViewItem() { Header = "Child 1" };
TreeViewItem child2 = new TreeViewItem() { Header = "Child 2" };
TreeViewItem grandchild1 = new TreeViewItem() { Header = "Grandchild 1" };
TreeViewItem grandchild2 = new TreeViewItem() { Header = "Grandchild 2" };
child1.Items.Add(grandchild1);
child2.Items.Add(grandchild2);
parent.Items.Add(child1);
parent.Items.Add(child2);
return parent;
}
}
}
公共类TreeViewModel:PropertyChangedBase
{
公共字符串值{get;set;}
公共ObservableCollection项{get;set;}
公共集合视图项视图{get;set;}
公共树视图模型(字符串值)
{
Items=新的ObservableCollection();
ItemsView=新建ListCollectionView(项目)
{
分类描述=
{
新排序说明(“值”,ListSortDirection.升序)
}
};
价值=价值;
}
}
视图模型
public class TreeViewModel : PropertyChangedBase
{
public string Value { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public CollectionView ItemsView { get; set; }
public TreeViewModel(string value)
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items)
{
SortDescriptions =
{
new SortDescription("Value",ListSortDirection.Ascending)
}
};
Value = value;
}
}
public class SortedTreeViewWindowViewModel : PropertyChangedBase
{
private string _newValueString;
public string NewValueString
{
get { return _newValueString; }
set
{
_newValueString = value;
OnPropertyChanged("NewValueString");
}
}
public TreeViewModel SelectedItem { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public ICollectionView ItemsView { get; set; }
public SortedTreeViewWindowViewModel()
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items) { SortDescriptions = { new SortDescription("Value", ListSortDirection.Ascending) } };
}
public void AddNewItem()
{
ObservableCollection<TreeViewModel> targetcollection;
//Insert the New Node as a Root node if nothing is selected.
targetcollection = SelectedItem == null ? Items : SelectedItem.Items;
if (_newValueString != null)
{
targetcollection.Add(new TreeViewModel(_newValueString));
NewValueString = string.Empty;
}
}
}
namespace TreeViewExample
{
using System.Collections.ObjectModel;
using System.Windows.Controls;
class MainWindowViewModel
{
public ObservableCollection<TreeViewItem> Tree { get; set; }
public MainWindowViewModel()
{
Tree = new ObservableCollection<TreeViewItem>();
Tree.Add(GetLoadedTreeRoot());
}
private TreeViewItem GetLoadedTreeRoot()
{
TreeViewItem parent = new TreeViewItem() { Header = "Parent" };
TreeViewItem child1 = new TreeViewItem() { Header = "Child 1" };
TreeViewItem child2 = new TreeViewItem() { Header = "Child 2" };
TreeViewItem grandchild1 = new TreeViewItem() { Header = "Grandchild 1" };
TreeViewItem grandchild2 = new TreeViewItem() { Header = "Grandchild 2" };
child1.Items.Add(grandchild1);
child2.Items.Add(grandchild2);
parent.Items.Add(child1);
parent.Items.Add(child2);
return parent;
}
}
}
公共类SortedTreeViewWindowViewModel:PropertyChangedBase
{
私有字符串_newValueString;
公共字符串NewValueString
{
获取{return\u newValueString;}
设置
{
_newValueString=值;
OnPropertyChanged(“NewValueString”);
}
}
公共树视图模型SelectedItem{get;set;}
公共ObservableCollection项{get;set;}
公共ICollectionView项目视图{get;set;}
公共分类TreeViewWindowViewModel()
{
Items=新的ObservableCollection();
ItemsView=new ListCollectionView(Items){SortDescriptions={new SortDescription(“Value”,ListSortDirection.升序)};
}
public void AddNewItem()
{
可观测采集目标采集;
//如果未选择任何内容,请将新节点作为根节点插入。
targetcollection=SelectedItem==null?项:SelectedItem.Items;
if(_newValueString!=null)
{
Add(newtreeviewmodel(_newValueString));
NewValueString=string.Empty;
}
}
}
查看隐藏代码
public partial class Window1 : Window
{
public SortedTreeViewWindowViewModel ViewModel { get { return DataContext as SortedTreeViewWindowViewModel; } set { DataContext = value; } }
public Window1()
{
InitializeComponent();
ViewModel = new SortedTreeViewWindowViewModel()
{
Items = {new TreeViewModel("Test")}
};
}
private void AddNewItem(object sender, RoutedEventArgs e)
{
ViewModel.AddNewItem();
}
private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
ViewModel.SelectedItem = e.NewValue as TreeViewModel;
}
}
namespace TreeViewExample
{
using System.Windows;
public partial class MainWindow : Window
{
public MainWindow()
{
DataContext = new MainWindowViewModel();
InitializeComponent();
}
}
}
公共部分类窗口1:窗口
{
公共SortedTreeViewWindowViewModel视图模型{获取{返回DataContext作为SortedTreeViewWindowViewModel;}设置{DataContext=value;}}
公共窗口1()
{
初始化组件();
ViewModel=新的SortedTreeViewWindowViewModel()
{
Items={new TreeViewModel(“Test”)}
};
}
私有void AddNewItem(对象发送方,路由目标)
{
ViewModel.AddNewItem();
}
SelectedItemChanged上的私有无效(对象发送方,RoutedPropertyChangedEventArgs e)
{
ViewModel.SelectedItem=e.NewValue作为TreeViewModel;
}
}
非常感谢你的帮助。我希望通过这篇文章可以帮助我理解如何编辑和构建ViewModels,以便我将来可以学习更多的即兴创作
更新
TreeView现在由字符串组成,因此该部分已解决。不过,我仍然需要有关默认节点的帮助。我已更新了代码以反映此更改。以下是我的建议
- 将int改为string的位置。TreeView应该处理这种变化
- 在ViewModel的构造函数中,手动插入默认节点。确保您了解如何使用TreeView,因为这将影响模型和ViewModel的设计,并自然地改进实现
<Window x:Class="TreeViewExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel>
<TreeView ItemsSource="{Binding Tree}"/>
</StackPanel>
</StackPanel>
</Window>
视图模型
public class TreeViewModel : PropertyChangedBase
{
public string Value { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public CollectionView ItemsView { get; set; }
public TreeViewModel(string value)
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items)
{
SortDescriptions =
{
new SortDescription("Value",ListSortDirection.Ascending)
}
};
Value = value;
}
}
public class SortedTreeViewWindowViewModel : PropertyChangedBase
{
private string _newValueString;
public string NewValueString
{
get { return _newValueString; }
set
{
_newValueString = value;
OnPropertyChanged("NewValueString");
}
}
public TreeViewModel SelectedItem { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public ICollectionView ItemsView { get; set; }
public SortedTreeViewWindowViewModel()
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items) { SortDescriptions = { new SortDescription("Value", ListSortDirection.Ascending) } };
}
public void AddNewItem()
{
ObservableCollection<TreeViewModel> targetcollection;
//Insert the New Node as a Root node if nothing is selected.
targetcollection = SelectedItem == null ? Items : SelectedItem.Items;
if (_newValueString != null)
{
targetcollection.Add(new TreeViewModel(_newValueString));
NewValueString = string.Empty;
}
}
}
namespace TreeViewExample
{
using System.Collections.ObjectModel;
using System.Windows.Controls;
class MainWindowViewModel
{
public ObservableCollection<TreeViewItem> Tree { get; set; }
public MainWindowViewModel()
{
Tree = new ObservableCollection<TreeViewItem>();
Tree.Add(GetLoadedTreeRoot());
}
private TreeViewItem GetLoadedTreeRoot()
{
TreeViewItem parent = new TreeViewItem() { Header = "Parent" };
TreeViewItem child1 = new TreeViewItem() { Header = "Child 1" };
TreeViewItem child2 = new TreeViewItem() { Header = "Child 2" };
TreeViewItem grandchild1 = new TreeViewItem() { Header = "Grandchild 1" };
TreeViewItem grandchild2 = new TreeViewItem() { Header = "Grandchild 2" };
child1.Items.Add(grandchild1);
child2.Items.Add(grandchild2);
parent.Items.Add(child1);
parent.Items.Add(child2);
return parent;
}
}
}
namespace树视图示例
{
使用System.Collections.ObjectModel;
使用System.Windows.Controls;
类MainWindowViewModel
{
公共可观测集合树{get;set;}
公共主窗口视图模型()
{
Tree=新的ObservableCollection();
Add(GetLoadedTreeRoot());
}
私有TreeViewItem GetLoadedTreeRoot()
{
TreeViewItem parent=new TreeViewItem(){Header=“parent”};
TreeViewItem child1=新的TreeViewItem(){Header=“Child 1”};
TreeViewItem child2=新的TreeViewItem(){Header=“child2”};
TreeViewItem孙子1=新的TreeViewItem(){Header=“孙子1”};
TreeViewItem孙子2=新的TreeViewItem(){Header=“孙子2”};
child1.项目。添加(1);
child2.项目。添加(2);
父项添加(子项1);
父项添加(子项2);
返回父母;
}
}
}
产生:
- 母公司
- 儿童1
- 孙女1
- 儿童2
- 孙女2
- 儿童1
- 为了清理代码,您可以查找一个命令实现,其中有很多。尽管您有时需要它,但尽可能避免代码隐藏中的代码。我非常喜欢它,因为它向您展示了一个通用的MVVM实现,而不涉及高级命令相关主题(ItemTemplates、Interactivity命名空间等)
TreeViewItems
。另一条评论:我看到您