TreeView选择的项目更改

时间:2013-12-21 07:18:33

标签: wpf treeview selecteditem

选择我的树视图时遇到问题。 我们的想法是用户点击该项目,并在他们选择的节点下添加数据

    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)
    }

似乎所选项目是一个文本块,我似乎无法找到一种方法将其作为树视图项目添加其下的节点。

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

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

我相信你正以错误的方式接近这一点。如果使用DataBinding填充TreeView,大多数问题都将消失。考虑以下课程

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和HierarchicalDataTemplate绑定到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;
}

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

我希望这会有所帮助

答案 1 :(得分:1)

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

TreeViewItem item = e.NewValue as TreeViewItem;

或者这是为了获得之前选择的项目:

TreeViewItem item = e.OldValue as TreeViewItem;

e.Source和e.OriginalSource指的是TreeView而不是选中的TreeViewItem。您可以使用断点然后在Visual Studio的监视中查看这些属性值和类型。这是我在发布之前所做的事情。

答案 2 :(得分:0)

你的权利,我很抱歉。 http://www.dotnetperls.com/给了我很多关于这种语言的信息。

我也习惯于在Visual Basic和Delphi等程序中编程。我已经意识到我的MainWindow需要对我的前端用户界面执行所有的物理操作,而其他命名空间中的类不执行此操作。

我已经意识到你调用一个类来执行特定的操作。然后,该类要么返回信息,要么将信息存储在公共属性中。其中MainWindow可以利用它并执行所需的操作。我没有意识到并试图从其他类操作我的用户界面。

我已经重建了我的项目,这里提供的信息帮助我完成了我的活动。

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

我现在就像一个小块。

相关问题