2009-11-05 8 views
3

J'ai donc une structure de classe comme celui-ciWPF TreeView liant par XAML

Store 
    Owner 
    Cashier 
    List of Products 
     Product Name 
     Price 
    List of Vendors 
     Company Name 
     Contact Name 

Donc il y a 4 objets: Store, personne (propriétaire et caissier), produit et fournisseur.

Je veux trouver un moyen de lier cette structure dans un arbre XAML, de sorte que chaque noeud est représente un objet de cette structure comme:

image http://img23.imageshack.us/img23/9337/treexq.png

Jusqu'à présent, je n'ai pu à cela avec un objet supérieur -> un sous-objet. Comme ceci:

Store 
    - Departmen 1 Products 
     Book 1 
     Book 2 
     Book 3 
    - Department 2 Products 
     Bike 1 
     Bike 2 
     Bike 3 

Donc, la différence est importante ici que dans le premier arbre, les sous-nœuds sont 3 types d'objets différents (magasin a 2 objets personne, 1 produit et 1 objets fournisseur); et dans le second, chaque nœud racine n'a qu'un seul type de sous-nœud (magasin a département, département a produits).

J'ai fait le deuxième exemple en utilisant HierarchicalDataTemplates, donc j'ai pensé que cela résoudrait mon problème, mais ce n'est pas le cas. Une idée sur comment je peux faire ça? Voici le code qui crée la structure de magasin:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     this.DataContext = new List<Store>() { Store.CreateStore() }; 
    } 
} 

public class Store 
{ 
    public string StoreName { get; set; } 
    public Person Owner { get; set; } 
    public Person Cashier { get; set; } 
    public List<Product> Products { get; set; } 
    public List<Vendor> Vendors { get; set; } 

    public Store() 
    { 
     this.Products = new List<Product>(); 
     this.Vendors = new List<Vendor>(); 
    } 

    public static Store CreateStore() 
    { 
     Store store = new Store(); 

     // set name 
     store.StoreName = "Book store"; 

     // set staff 
     store.Owner = new Person() { FirstName = "John", LastName = "Smith" }; 
     store.Cashier = new Person() { FirstName = "Jane", LastName = "Smart" }; 

     // add products 
     store.Products.Add(new Product() { Name = "Mechanical Pencil", Price = 1.25m}); 
     store.Products.Add(new Product() { Name = "Pen", Price = 2.50m }); 
     store.Products.Add(new Product() { Name = "WPF Book", Price = 28.94m }); 
     store.Products.Add(new Product() { Name = "ASP.NET Book", Price = 29.50m }); 

     // add vendors 
     store.Vendors.Add(new Vendor() { CompanyName = "Bic", ContactName = "Bill Gates" }); 
     store.Vendors.Add(new Vendor() { CompanyName = "O'Reilly", ContactName = "Steve Jobs" }); 

     return store; 
    } 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Product 
{ 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

public class Vendor 
{ 
    public string CompanyName { get; set; } 
    public string ContactName { get; set; } 
} 

Je veux éviter de créer la structure d'arbre du côté de code. Toute aide est la bienvenue.

Répondre

2

J'ai trouvé un excellent article Organizing Heterogeneous Data on a WPF TreeView qui a résolu ce problème en utilisant MultiBinding pour combiner les différentes collections et objets ensemble, et un MultiValueConverter pour "façonner" l'arborescence des éléments. J'ai résolu beaucoup de mes problèmes, mais je travaillais encore sur le style à mon goût.

J'espère que cela aide

+0

Ok, ça ressemble à ce dont j'ai exactement besoin. Je reviendrai vers toi. Merci!! – Carlo

+0

Enfin eu le temps de tester cela. Fonctionne comme un charme, merci! – Carlo