2012-06-06 29 views
12

Estoy haciendo una aplicación WPF siguiendo el patrón MVVM. En este estoy utilizando el marco de la entidad,Visualización de entidades en TreeView usando MVVM

mi estructura de la entidad es simple, tiene 3 entidades: departamento, por supuesto, libros,

un departamento puede tener muchos cursos, y un curso puede tener muchos libros,

ahora quiero mostrar esto en una vista de árbol, por lo que mi salida en WPF debe tener este aspecto,

Department1 

    Course1 

    Book1 

    Book2 

    Course2 

    Book3 

Department2 

    Course 

    Book 

Department3 

en mi modelo de vista que tengo EntityContext objeto. Pero no sé cómo mostrar esto en una vista de árbol. cómo puedo hacer esto.

Respuesta

16

me preparó la pequeña muestra de replicar este ..

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:this="clr-namespace:TestApp" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.DataContext> 
     <this:TreeViewModel /> 
    </Window.DataContext> 

    <Window.Resources> 

     <HierarchicalDataTemplate ItemsSource="{Binding Courses}" DataType="{x:Type this:Department}"> 
      <Label Content="{Binding DepartmentName}"/> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate ItemsSource="{Binding Books}" DataType="{x:Type this:Course}"> 
      <Label Content="{Binding CourseName}"/> 
     </HierarchicalDataTemplate> 

     <DataTemplate DataType="{x:Type this:Book}"> 
      <Label Content="{Binding BookName}"/> 
     </DataTemplate> 

    </Window.Resources> 

    <Grid> 
     <TreeView ItemsSource="{Binding Departments}"> 

     </TreeView> 
    </Grid> 
</Window> 

modelo y ViewModel clases.

public class Book :ViewModelBase 
    { 
     private string bookname = string.Empty; 

     public string BookName 
     { 
      get 
      { 
       return bookname; 
      } 
      set 
      { 
       bookname = value; 
       OnPropertyChanged("BookName"); 
      } 
     } 

     public Book(string bookname) 
     { 
      BookName = bookname; 
     } 
    } 

clase Departamento

public class Department : ViewModelBase 
    { 
     private List<Course> courses; 

     public Department(string depname) 
     { 
      DepartmentName = depname; 
      Courses = new List<Course>() 
      { 
       new Course("Course1"), 
       new Course("Course2") 
      }; 
     } 

     public List<Course> Courses 
     { 
      get 
      { 
       return courses; 
      } 
      set 
      { 
       courses = value; 
       OnPropertyChanged("Courses"); 
      } 
     } 

     public string DepartmentName 
     { 
      get; 
      set; 
     } 
    } 

Curso

public class Course :ViewModelBase 
    { 
     private List<Book> books; 

     public Course(string coursename) 
     { 
      CourseName = coursename; 
      Books = new List<Book>() 
      { 
       new Book("JJJJ"), 
       new Book("KKKK"), 
       new Book("OOOOO") 
      }; 
     } 

     public List<Book> Books 
     { 
      get 
      { 
       return books; 
      } 
      set 
      { 
       books = value; 
       OnPropertyChanged("Books"); 
      } 
     } 

     public string CourseName 
     { 
      get; 
      set; 
     } 
    } 

clase TreeViewModel.

public class TreeViewModel :ViewModelBase 
    { 
     private List<Department> departments; 

     public TreeViewModel() 
     { 
      Departments = new List<Department>() 
      { 
       new Department("Department1"), 
       new Department("Department2") 
      }; 
     } 

     public List<Department> Departments 
     { 
      get 
      { 
       return departments; 
      } 
      set 
      { 
       departments = value; 
       OnPropertyChanged("Departments"); 
      } 
     } 
    } 

Clase de ViewModelBase.

public class ViewModelBase :INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propname) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propname)); 
      } 
     } 
    } 

Por último, muestra los datos en el formato jerárquico .. Espero que esto le satisfaría ...

+0

ahora quiero agregar el elemento seleccionado, cómo puedo hacer eso, como elemento seleccionado en el árbol puede ser departamento libro o curso, hay SelectedItem en la vista de lista, pero en hierarchicalDataTemplate no hay ningún elemento seleccionado, –

3

Tiene que definir la plantilla de plantilla de datos de jerarquía para este Here es la muestra de cómo usar esto.

0

es necesario definir el nivel 'n' de HierachialDataTemplate para el nivel anidado queremos .. Vamos a tener la propiedad ItemsSource para la clase HierarchicalDataTemplate para definir esto ... Podemos hacer lo mismo con MenuControl también ...

Cuestiones relacionadas