我知道它并没有过度关注MVVM,但我没有多少选择。 我正在构建一个WMI浏览器(如此)
该东西列出了所有名称空间,然后用户单击他们想要的名称空间,然后在树视图框中列出所有类。
用户然后单击树视图框,并在单击的树视图项下方加载方法/实例/属性。
一切正常我使用propeties / methods等获取treeview项目。 他们甚至扩大了,但那里只有空白项目。 任何人都知道如何将Ovbservablecollections绑定到树视图项列表?
这是代码。
我的观点:
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 Children()
{
base.GetClassData(SelectedItem.Header.ToString());
}
我的模特
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;
}
}
}
答案 0 :(得分:0)
是的,你是对的,这不是关注MVVM,问题在于你如何设置ItemSource -
ItemsSource = "BaseClassesData",
我认为您可能必须首先指定TreeNode的DataContext,然后创建一个绑定来指定ItemSource(而不是仅指定ItemsSource = "BaseClassesData
“)
或者直接指定您在评论中提到的ItemSource。
以上两种方法都要求您在View中访问ViewModel,View accessing ViewModel
中没有任何错误;在MVVM视图中总是依赖于ViewModel并始终了解它并使用它(间接通过Bindings和Directly in code)。
最后,如果这不仅仅是一个临时。项目并且需要在将来维护/增强我建议您实施适当的MVVM;你会遇到许多要求,如选择,扩展,动态加载,搜索等,并且在代码中执行所有这些操作将非常麻烦且难以维护。
请查看以下文章 -
Simplifying the WPF TreeView by Using the ViewModel Pattern
另请参阅以下SO问题,其中包含使用MVVM执行非常类似操作的代码 -