C# 如何在ViewModel中正确解析TreeviewItem的子项?
我的WPF程序中有一个C# 如何在ViewModel中正确解析TreeviewItem的子项?,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我的WPF程序中有一个TreeView控件,它从MySQL服务器获取数据,并显示数据库和表: Server ...Databases ...Tables 我想要的是,当我在树视图中单击一个项目时,我可以得到服务器/数据库/表的名称。但是,经过几个小时的测试,我仍然无法得到名称 服务器的HierarchycalDataTemplate <HierarchicalDataTemplate DataType="{x:Type local:ServerViewModel}"
TreeView
控件,它从MySQL服务器获取数据,并显示数据库
和表
:
Server
...Databases
...Tables
我想要的是,当我在树视图中单击一个项目时,我可以得到服务器/数据库/表的名称。但是,经过几个小时的测试,我仍然无法得到名称
服务器的HierarchycalDataTemplate
<HierarchicalDataTemplate
DataType="{x:Type local:ServerViewModel}"
ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Margin="3,0" Source="Figures/server.png" />
<TextBlock Text="{Binding ServerName}" />
</StackPanel>
</HierarchicalDataTemplate>
在ViewModel中,我调用了一个命令来处理SelectedItemChanged
事件。我实现了下面的Execute()方法,但它不起作用。每当我单击树视图项时,都会抛出一个未处理的异常System.Reflection.TargetInvocationException
private void GetSelectedItem(object parameter)
{
var item = parameter as TreeViewItem;
StackPanel stackpanel = (StackPanel)VisualTreeHelper.GetChild(item, 0);
TextBlock textblock = (TextBlock)VisualTreeHelper.GetChild(stackpanel, 1);
MessageBox.Show(textblock.Text);
}
更新
命令
public ICommand tableSelected { get; private set; }//In the ViewModel
tableSelected=newrelaycommand((obj)=>GetSelectedItem(obj),(obj)=>true);
//在ViewModel的构造函数中实现
我读过几篇关于Stackoverflow的相关文章,比如,,,但我仍然不能正确理解。请帮助,谢谢。我意识到我之前所做的完全错误。SelectedItem不是UI控件的集合,而是与DataType相同类型的纯实例
<HierarchicalDataTemplate
DataType="{x:Type local:DatabaseViewModel}"
ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Margin="3,0" Source="Figures/database.png" />
<TextBlock Text="{Binding DatabaseName}" />
</StackPanel>
</HierarchicalDataTemplate>
上面的代码是我的treeview的一部分。如果我单击使用此模板的treeview项目,我得到的是一个DatabaseViewModel实例,而不是StackPanel或其子实例。这对WPF初学者来说确实是一种误导。“声明了一个处理SelectedItemChanged的命令”这是错误的。请注意,SelectedItemChanged是一个DependencyProperty。在各自的ViewModel中,创建一个类似“SelectedWhatever”的属性(通过INotifyPropertyChanged
为其实现更改通知),然后仅将此ViewModel属性绑定到SelectedItem。您的代码的哪一行引发了您提到的异常?您尝试获取但失败的名称的属性在哪里?向我们展示它。我的绑定没有问题。我使用的是MvvmLight,事实上我声明了一个RelayCommand
。我将更新我的问题以避免误解。我想要得到的是树视图项
中文本块
的文本属性,我正在尝试解析该属性。
tableSelected = new RelayCommand<object>((obj) => GetSelectedItem(obj), (obj) => true);
//Implemented in the ViewModel's constructor
<HierarchicalDataTemplate
DataType="{x:Type local:DatabaseViewModel}"
ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Margin="3,0" Source="Figures/database.png" />
<TextBlock Text="{Binding DatabaseName}" />
</StackPanel>
</HierarchicalDataTemplate>