WPF Treeview Databinding danych hierarchicznych z typami mieszanymi

Mam trochę skomplikowaną sytuację z wiązaniem WPF Treeview. Spędziłem ostatnie 2 dni próbując go wygooglować i to {[5] } jest zamknięte, które wymyśliłem, ale nie rozwiązuje problemu.

Oto sytuacja:

Mam obiekt, który wygląda tak:

public class Category
{
  public string Name { get; set; }
  public List<Category> Categories { get; set; }
  public List<Product> Products { get; set; }
}

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

Każda kategoria może mieć listę obiektów i kategorii podrzędnych. Mam do tego powód, który ma dla mnie pełny sens i aplikację, którą piszę.

Rzeczywisty obiekt konstrukcja może wyglądać mniej więcej tak:

Category - Pharmacy
  |-Product - Aspirin
  |-Product - Tylenol
  |-Category - Tooth Paste
  |  |-Product - Crest
  |  |-Product - Colgate
  |-Category - Paper Products
   |-Category - Toilet Paper
   |  |-Product - NoName
   |  |-Product - Charmin
   |-Category - Facial Tissue
      |-Product - Kleenex
Category - Household
  |-Product - Pinesol Cleaner
  |-Product - Garbage Bags
Próbuję powiązać ten związek z treeview. Chciałbym, aby TreeView wyglądał niemal identycznie do powyższej konstrukcji obiektu.

Jak na razie mój XAML TreeView wygląda tak:

  <TreeView x:Name="CategoryList" Margin="8" Grid.Row="2" Grid.RowSpan="2" ItemsSource="{Binding Path=Categories}">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type src:Category}" ItemsSource="{Binding Products}">
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type src:Product}">
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>

To działa świetnie dla głównej listy kategorii i każdego z jej produktów podrzędnych. Ale nie idzie głębiej i wyświetla podkategorie pod każdą kategorią.

Czy jest jakiś sposób, aby to zrobić bezpośrednio z Szablony tak, aby każdy element (Kategoria lub produkt) został wybrany? Używam wzorca MVVM i nie chcę uciekać się do korzystania z kodu za, ale będzie, jeśli jest to konieczne.

Author: Community, 2010-09-09

1 answers

Ponieważ chcesz, aby elementy w widoku drzewa miały listę dzieci, która składa się z obu kategorii produktów, będziesz chciał, aby twój model widoku kategorii miał kolekcję, która składa się zarówno z kategorii, jak i produktów. Na przykład, możesz użyć CompositeCollection, Aby połączyć istniejące Kolekcje:

public class Category
{
    public string Name { get; set; }
    public List<Category> Categories { get; set; }
    public List<Product> Products { get; set; }

    public IList Children
    {
        get
        {
            return new CompositeCollection()
            {
                new CollectionContainer() { Collection = Products },
                new CollectionContainer() { Collection = Categories }
            };
        }
    }
}

(w prawdziwym kodzie prawdopodobnie chciałbyś zachować odniesienie do tego samego obiektu collection, zamiast tworzyć nowy za każdym razem.)

Następnie w twoja HierarchicalDataTemplate, użyj połączonej listy jako ItemsSource:

<HierarchicalDataTemplate DataType="{x:Type src:Category}"
                          ItemsSource="{Binding Children}">

Elementy będą mieszanką produktów i kategorii, a WPF użyje odpowiedniej płyty danych dla każdego z nich.

 49
Author: Quartermeister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-09 01:45:58