选择我的树视图时遇到问题。 我们的想法是用户点击该项目,并在他们选择的节点下添加数据
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)
}
似乎所选项目是一个文本块,我似乎无法找到一种方法将其作为树视图项目添加其下的节点。
是的,我对这种类型的编程很陌生。
感谢您提供的任何帮助。
答案 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。
我现在就像一个小块。