TreeViewItem从代码绑定

时间:2014-01-09 05:04:46

标签: c# wpf mvvm treeview

我知道它并没有过度关注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;
         }
     }
 }

1 个答案:

答案 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执行非常类似操作的代码 -

WPF: Binding TreeView in MVVM way step by step tutorial