C# 如何在ViewModel中正确解析TreeviewItem的子项?

C# 如何在ViewModel中正确解析TreeviewItem的子项?,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我的WPF程序中有一个TreeView控件,它从MySQL服务器获取数据,并显示数据库和表: Server ...Databases ...Tables 我想要的是,当我在树视图中单击一个项目时,我可以得到服务器/数据库/表的名称。但是,经过几个小时的测试,我仍然无法得到名称 服务器的HierarchycalDataTemplate <HierarchicalDataTemplate DataType="{x:Type local:ServerViewModel}"

我的WPF程序中有一个
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>