C# 来自代码的TreeViewItem绑定

C# 来自代码的TreeViewItem绑定,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我知道它没有过度遵循MVVM,但我没有太多选择。 Im正在构建WMI浏览器(因此) 它列出了所有的名称空间,用户然后单击他们想要的名称空间,然后在树视图框中列出所有的类 然后,用户单击treeview框,并在单击的treeview项下加载方法/实例/属性 一切正常,我得到了带有属性/方法等的treeview项目。 它们甚至被扩展,但是那里只有空白项。 有人知道如何将Ovbservablecollections绑定到treeview项目列表吗 这是代码 我的看法是: public void Tre

我知道它没有过度遵循MVVM,但我没有太多选择。 Im正在构建WMI浏览器(因此)

它列出了所有的名称空间,用户然后单击他们想要的名称空间,然后在树视图框中列出所有的类

然后,用户单击treeview框,并在单击的treeview项下加载方法/实例/属性


一切正常,我得到了带有属性/方法等的treeview项目。 它们甚至被扩展,但是那里只有空白项。 有人知道如何将Ovbservablecollections绑定到treeview项目列表吗

这是代码

我的看法是:

public void TreeView_BaseClasses_Event_SelectionChanged(Object sender, RoutedPropertyChangedEventArgs<object> e)
{
   if (this.IsLoaded)
   {
      if (((TreeView)sender).Name == "TreeView_BaseClasses")
      {
         TreeView TheTreeView = e.OriginalSource as TreeView;

         TreeViewItem SelectionChanged = ((TreeView)sender).ItemContainerGenerator.ContainerFromIndex(TheTreeView.Items.IndexOf(TheTreeView.SelectedItem)) as TreeViewItem;
         SelectionChanged.Items.Add(new TreeViewItem()
         {
             Header = "Properties",
             ItemsSource = "BaseClassesData",
             DisplayMemberPath = "ClassProperties"
         }
         );
         SelectionChanged.Items.Add(new TreeViewItem()
         {
             Header = "Methods",
             ItemsSource = "BaseClassesData",
             DisplayMemberPath = "ClassMethods"
         }
         );
         SelectionChanged.Items.Add(new TreeViewItem()
         {
             Header = "Instances",
             ItemsSource = "BaseClassesData",
             DisplayMemberPath = "ClassInstances"
         }
         );
         SelectionChanged.Items.Add(new TreeViewItem()
         {
             Header = "Sub Classes",
             ItemsSource = "BaseClassesData",
             DisplayMemberPath = "ClassSubClasses"
         }
         );
         ThisViewModel.SelectedItem = SelectionChanged;
         ThisViewModel.Children();
         SelectionChanged.ExpandSubtree();
         SelectionChanged.IsSelected = true;
         e.Handled = true;
   }
}
我的模型

 public void GetClassData(string ClassName)
 {
     ManagementClass EnumClasses = new ManagementClass(ClassName);
     ClassData NewClass = new ClassData();
     try
     {
        foreach (ManagementObject objClass in EnumClasses.GetSubclasses())
        {
            NewClass.ClassSubClasses.Add(objClass.ClassPath.ClassName);
        }
        foreach (ManagementObject objInstance in EnumClasses.GetInstances())
        {
            NewClass.ClassInstances.Add(objInstance.ToString());
        }
        foreach (PropertyData Prop in EnumClasses.Properties)
        {
            NewClass.ClassProperties.Add(Prop.Name);
        }
        foreach (MethodData meth in EnumClasses.Methods)
        {
            NewClass.ClassMethods.Add(meth.Name);
        }
        NewClass.ClassEnumeration();
     }
     catch {

     }
     finally
     {
         BaseClassesData.Add(NewClass);
     }
}
public class ClassData
{
    public String ClassName { get; set; }
    public String ClassPath { get; set; }
    public ManagementScope ClassScope { get; set; }
    public ISite ClassSite { get; set; }
    public String ClassNamespace { get; set; }
    public ObservableCollection<String> ClassInstances { get; set; }
    public ObservableCollection<String> ClassProperties { get; set; }
    public ObservableCollection<String> ClassSubClasses { get; set; }
    public ObservableCollection<String> ClassMethods { get; set; }
    public ClassData()
    {
        ClassInstances = new ObservableCollection<string>();
        ClassProperties = new ObservableCollection<string>();
        ClassSubClasses = new ObservableCollection<string>();
        ClassMethods = new ObservableCollection<string>();
    }
    public void ClassEnumeration()
    {
        if (ClassName != null)
        {
           ClassPath = new ManagementClass(ClassName).ClassPath.Path;
           ClassScope = new ManagementClass(ClassName).Scope;
           ClassSite = new ManagementClass(ClassName).Site;
           ClassNamespace = new ManagementClass(ClassName).ClassPath.NamespacePath;
         }
     }
 }
public void GetClassData(字符串ClassName)
{
ManagementClass EnumClasses=新的ManagementClass(类名);
ClassData NewClass=新的ClassData();
尝试
{
foreach(EnumClasses.GetSubClass()中的ManagementObject对象类)
{
添加(objClass.ClassPath.ClassName);
}
foreach(EnumClasses.GetInstances()中的ManagementObject对象实例)
{
添加(objInstance.ToString());
}
foreach(EnumClasses.Properties中的PropertyData属性)
{
NewClass.ClassProperties.Add(Prop.Name);
}
foreach(EnumClasses.Methods中的MethodData meth)
{
NewClass.ClassMethods.Add(meth.Name);
}
NewClass.ClassEnumeration();
}
抓住{
}
最后
{
BaseClassesData.Add(NewClass);
}
}
公共类类数据
{
公共字符串类名{get;set;}
公共字符串类路径{get;set;}
公共管理范围类范围{get;set;}
公共ISite类站点{get;set;}
公共字符串类命名空间{get;set;}
公共ObserviceCollection ClassInstances{get;set;}
公共ObservableCollection类属性{get;set;}
公共ObservableCollection类子类{get;set;}
公共ObservableCollection类方法{get;set;}
公共类数据()
{
ClassInstances=新的ObservableCollection();
ClassProperties=新的ObservableCollection();
ClassSubclass=新的ObservableCollection();
ClassMethods=新的ObservableCollection();
}
公共void类枚举()
{
if(ClassName!=null)
{
ClassPath=新的管理类(ClassName).ClassPath.Path;
ClassScope=新的管理类(ClassName).Scope;
ClassSite=新的管理类(ClassName).Site;
ClassNamespace=新的管理类(ClassName).ClassPath.NamespacePath;
}
}
}

是的,您是对的,这不是MVVM,问题在于如何设置ItemSource-

ItemsSource = "BaseClassesData",
我认为您可能必须首先指定TreeNode的DataContext,然后创建一个绑定来指定ItemSource(而不是只指定
ItemsSource=“BaseClassesData
”) 或者直接指定您在评论中提到的ItemSource

上述两个CSE都要求您访问视图中的ViewModel,而
视图访问ViewModel没有任何错误;在MVVM视图中,视图始终依赖于ViewModel,并且始终了解并使用它(通过绑定间接地使用,并直接在代码中使用)

最后,以防这不仅仅是临时工。我建议您实施适当的MVVM;您将遇到许多需求,如选择、扩展、动态加载、搜索等,而在代码中执行这些操作将非常繁琐且无法维护

请看下面的文章这样做-

还可以看一下下面的问题,其中包含使用MVVM执行类似操作的代码-


我发现我可以使用ItemsSource=ThisViewModel.ViewBaseClasseData[0].ClassProperties,但必须有更好的方法。这是我的视图访问我的视图模型,这很糟糕“一切正常,我得到了带有属性/方法等的treeview项。它们甚至被展开,但那里只有空白项。”-treeview只是显示您拥有的数据。空树项表示集合中有空数据项。我检查了数据。正如我所说,我知道它不遵循MVVM模式。然而,我的模型得到了所有的数据,没有问题。我这样做只是为了测试。我现在的问题是如何显示我的数据。我找不到任何关于将类绑定到源代码为动态的多个treeview层的教程。看起来我可能不得不将整个treeview放在一个可观察的集合中,我不想这样做,因为类数据在其他地方使用。
ItemsSource = "BaseClassesData",