2012-06-12 1 views
2

Dans mon application, j'ai reçu cette erreur chaque fois que l'arborescence charge ses éléments. Cette erreur rend mon application lente en charge et prend au moins deux minutes à charger.WPF treeview ItemTemplate et ItemTemplateSelector sont ignorés

L'erreur est: System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='TreeViewItem'

Mon code XAML pour le TreeView est: (J'utilise VB.net sur mon ViewModel)

<TreeView ScrollViewer.VerticalScrollBarVisibility="Hidden" 
      ItemContainerStyle="{DynamicResource tviStyle}" 
      Background="#FFF0F0F0" BorderBrush="#FFE5E2DB" 
      IsEnabled="{Binding isTreeEnable}" 
      ItemsSource="{Binding PostcodeLijst}" 
      Margin="0" Name="dgStamOverzichtPostcode" /> 

La liaison du ItemsSource est un ObservableCollection (Of TreeViewItem) thats est rempli à partir d'une base de données.

J'ai regardé dans google pour la réponse mais jusqu'ici je n'ai pas pu le trouver! Est-ce que quelqu'un sait comment résoudre ce problème?

Merci à l'avance pour toute aide

Répondre

5

Au lieu de créer une liste de TreeViewItems dans votre modèle de vue, créer une liste d'objets qui décrivent simplement les données que vous voulez montrer, même si elle est aussi simple que

class Item 
{ 
    public string Header { get;set; } 
} 

TreeViewItem est déjà associé à un modèle.

+2

Je suis d'accord avec Andy, un coup d'oeil à cet article - [Simplifying the WPF TreeView à l'aide du modèle ViewModel] (http://www.codeproject.com/Articles/26288/Simplifying-the -WPF-TreeView-en-utilisant-t he-ViewMode) – akjoshi

3

Vous êtes des éléments de liaison qui sont déjà des éléments d'interface utilisateur (ici: TreeViewItems). Normalement, vous liez tous les objets à votre itemsSource et ItemsContainerGenerator puis créez TreeViewItems pour chaque élément lié.

Cela ne peut pas être fait dans votre cas, vous avez déjà TreeViewItems, par conséquent, les modèles ne peuvent pas être appliqués, et c'est pourquoi vous obtenez ce message d'erreur.

Vous pouvez résoudre cette façon:

a) Bind DataObjects à votre arbre, pas les TreeViewItems, ils seront créés automatiquement

b) affecter vos styles directement aux treeviewItems que vous avez déjà

Voir aussi ce link

+0

A propos de l'option A, vous me dites de changer la propriété PostcodeLijst de ObservableCollection (de TreeViewItem) à quelque chose d'autre ?! Je ne comprends pas le point ici: P – Rui

+0

Ce que je veux dire, c'est que PostcodeLijst ne devrait pas être une ObservableCollection , mais plutôt une simple représentation de données, par ex. ObservableCollection . Dans votre implémentation actuelle, votre ViewModel sait que les codes postaux sont affichés en tant que TreeViewItems. Mais ce n'est pas son travail (et d'ailleurs ce n'est pas comme MVVM). Que faire si vous aimez changer votre arbre pour quelque chose d'autre comme un listview? Mon option suggérée a) est exactement la même que l'utilisateur "Andy" a déjà suggéré dans son message et je suis entièrement d'accord avec elle. – SvenG