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