Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将TreeView项添加到TreeView控件_C#_Wpf_Mvvm_Treeview - Fatal编程技术网

C# 如何将TreeView项添加到TreeView控件

C# 如何将TreeView项添加到TreeView控件,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,这个问题是问题的后续问题。我从这个网站上得到了一些建议,并决定开始学习如何使用TreeViews实现我的工作。尽管如此,我对MVVM还是很陌生,而且我仍然对语法和实现很熟悉 我有一个显示整型数据的树状视图,但我希望它能处理字符串。该树还允许用户通过选择TreeViewItem,然后在文本框中键入新的整数标题,然后单击按钮来添加到任何级别 我想让父母、孩子和孙子在创业时都有预定义的名字。另一件需要注意的事情是,该用户只能在子级添加到树视图(因此他们只能添加孙子) 型号 public class

这个问题是问题的后续问题。我从这个网站上得到了一些建议,并决定开始学习如何使用TreeViews实现我的工作。尽管如此,我对MVVM还是很陌生,而且我仍然对语法和实现很熟悉

我有一个显示整型数据的树状视图,但我希望它能处理字符串。该树还允许用户通过选择TreeViewItem,然后在文本框中键入新的整数标题,然后单击按钮来添加到任何级别

我想让父母、孩子和孙子在创业时都有预定义的名字。另一件需要注意的事情是,该用户只能在子级添加到树视图(因此他们只能添加孙子)

型号

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的设计,并自然地改进实现
下面是一个非常简单的示例,说明如何填充ViewModel中绑定到视图中TreeView的树:

查看

<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
其他想法:

  • 为了清理代码,您可以查找一个命令实现,其中有很多。尽管您有时需要它,但尽可能避免代码隐藏中的代码。我非常喜欢它,因为它向您展示了一个通用的MVVM实现,而不涉及高级命令相关主题(ItemTemplates、Interactivity命名空间等)

您能否将所有类型声明从int更改为string?当然可以,但我仍然不知道如何在启动时处理默认的
TreeViewItems
。另一条评论:我看到您