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.
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.
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