当前位置: 首页 > 知识库问答 >
问题:

TreeView所选项目更改

慕宏峻
2023-03-14

在选择我的treeview时遇到问题。其思想是,用户单击该项,然后将数据添加到他们选择的节点下

    public MainWindow()
    {
        InitializeComponent();
        this.UserControl1.TreeView1.SelectedItemChanged += new RoutedPropertyChangedEventHandler<Object>(InterfaceTreeViewComputers_SelectionChange);
    }

    void InterfaceTreeViewComputers_SelectionChange(Object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        var MyTreeView = MainWindow.UserControl1.Treeview1.Items.SourceCollection;
        var TheSource = sender as TreeView;
        var TheProperty = e.Source;
        var ThePropertyAsTreeView = TheProperty as TreeView

        TreeViewItem item = e.OriginalSource as TreeViewItem; //Equals Null
        var Attempt2 = ThePropertyAsTreeView.SelectedItem //Equals Null
        var Attempt3 = TheSource.SelectedItem as TreeViewItem //Equals Null
        var Attempt4 = TheSource.SelectedItem //Equals onbject(String)
    }

似乎所选项目是一个文本块,我似乎找不到一种方法将其作为treeview项目来添加节点。

是的,我对这种编程很陌生。

感谢您提供的任何帮助。

共有3个答案

穆建华
2023-03-14

你说得对,我很抱歉。http://www.dotnetperls.com/在这门语言上给了我大量的信息。

我太习惯用visualbasic和Delphi编程了。我现在意识到,我的主窗口需要对我的前端用户界面执行所有的物理操作,而其他名称空间中的类则不这样做。

我知道你调用一个类来执行一个特定的操作。然后,该类返回信息或将信息存储在公共属性中。其中主窗口可以利用此功能并执行所需的操作。我没有意识到这一点,并且试图从其他类操纵我的用户界面。

从那以后,我重组了我的项目,这里提供的信息帮助了我的活动。

现在我在XAML主窗口(Performin事件和更新UI)和其他类(获取数据或设计控件)中编写了UI,以便主窗口可以向UI添加控件或数据。

我现在像一个小家伙一样旋转。

邴子实
2023-03-14

我相信你的做法是错误的。如果您使用数据绑定来填充树视图,那么您的大多数问题都会消失。考虑以下几类

namespace StackOverflow._20716616
{
    public class Model
    {
        public Model() 
        { Items = new ObservableCollection<Model>(); }
        public Model(string text) 
            : this() 
        { Text = text; }
        public string Text { get; set; }
        public ObservableCollection<Model> Items { get; set; }
    }
}

使用这个类作为MVVM模式的模型,我可以创建一个层次对象图,我可以使用ItemsSource和HierarchycalDataTemplate之类的工具将其绑定到TreeView

<TreeView ItemsSource="{Binding Path=Items}" SelectedItemChanged="TreeView_OnSelectedItemChanged">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type this:Model}" ItemsSource="{Binding Path=Items}">
            <TextBlock Text="{Binding Path=Text}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

窗口的DataContext设置在xaml的根节点上

DataContext="{Binding RelativeSource={RelativeSource Self}}"

在后面的代码中,我填充了TreeView的根项

public MainWindow()
{
    Items = new ObservableCollection<Model>() { new Model("one"), new Model("two"), new Model("three") };
    InitializeComponent();
}

public ObservableCollection<Model> Items { get; set; }

然后,在SelectedItemChanged中,我可以将子对象添加到对象图中

private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var model = e.NewValue as Model;

    if (!model.Items.Any())
    {
        new List<Model>() { new Model("one"), new Model("two"), new Model("three") }
            .ForEach(model.Items.Add);
    }

    // expand the selected item.
    var item = ((TreeView)sender).ItemContainerGenerator.ContainerFromItem(model) as TreeViewItem;
    item.IsExpanded = true;
}

注意,这是poor man的MVVM,我使用了Windows代码作为ViewModel。为了简洁起见,我还省略了空检查和异常捕获。

我希望这有帮助

潘秦斩
2023-03-14

尝试此操作以获取所选项目:

TreeViewItem item = e.NewValue as TreeViewItem;

或此获取先前选择的项目:

TreeViewItem item = e.OldValue as TreeViewItem;

E.来源和e.原始源指的是TreeView而不是选择的TreeViewItem。可以使用断点,然后在Visual Studio的监视中查看这些属性值并键入。这就是我在发布这个之前所做的。

 类似资料:
  • 我有一个清单,我在回收商的视图中展示了这一点 一些项目有蓝色背景和其他项目有灰色背景 我想编辑所选项目背景(所选项目表示已单击的项目) 这是我的适配器类

  • 我认为这个解决方案是非常愚蠢的,必须有一个方法如何编码它更好。我不能每次都创建一个新的Person实例,这对我来说是不可接受的。 我也尝试为treeView触发一个事件,但这种方法会破坏焦点,也是一个愚蠢的解决方案。我也找到了这样的解决办法: 这也是不好的解决办法。

  • 注意:我实际上不确定为什么这种情况首先需要监听器,因为我甚至不想经常监听,而是在调用方法时得到结果。

  • 问题内容: 我正在尝试使用treeView创建菜单。这是我第一次使用treeView,并且已经在多个网站上进行了阅读。 我在进行动作事件时遇到一些问题。我想要做的基本上是在用户单击树形视图中的某个节点时触发并发生事件,到目前为止,我有以下内容: 不幸的是,这似乎不起作用。 有什么方法可以在不更改类型的情况下将甚至添加到单个项目? 问题答案: 根据JavaFX 2.2文档 : “..A TreeIt

  • 在我的应用程序中,左侧有一个,我根据中的选择更新右侧的窗格。一个非常直接的场景。当选择为空时,我会在窗格中显示类似“请进行选择”的消息,即我也会在 ,以防用户单击某些。侦听器还附加到所选的的,以防用户没有单击某些项目,但所选项目的值因某种原因而更改。用户可以通过单击其中的删除按钮来删除特定项目。在任何时候,用户可以点击更新按钮来更新显示当前选择的标签内容,以防我的处理程序错过了一些事件。 在这个简

  • 问题内容: 谁能告诉我从我删除所选项目的简便方法? 我在Google和此处进行了搜索,但发现了很多方法。我应该使用哪种方式? 问题答案: 正如@Andreas_D所说,以数据为中心,更抽象的ListModel是解决方案。这可以是DefaultListModel。您应该在JList中显式设置模型。所以(感谢@kleopatra发表评论): DefaultListModel中有几种方法。 顺便说一句,