2010-11-29 29 views
0

Je suis lier une liste d'objets à un ItemsControl qui contient un contrôle TextBox.propriétés de liaison à jour WPF de plusieurs éléments contenus dans une liste en même temps

Je veux être en mesure de changer la couleur de fond de zone de texte basée sur la propriété de couleur de fond de l'objet de liaison.

Cela fonctionne parfaitement avec l'interface INotifyPropertyChanged mais quand j'ai besoin de mettre à jour disons 1000 objets, cela prend énormément de temps car il faut mettre à jour les contrôles un par un.

Est-ce que quelqu'un a une astuce pour moi de dire LETS, mettre à jour tous mes objets couleur de fond et que mettre à jour la liaison d'un seul coup au lieu d'objet par objet?

Merci,

Mat

+0

Vous tiriez un événement PropertyChanged avec le nom de la propriété "BackgroundColor" ou null? – Guy

+0

En règle générale, vous devez utiliser un ItemTemplate pour styler la couleur d'arrière-plan de vos éléments en fonction d'une propriété plutôt que d'avoir la couleur explicite en tant que couleur dans l'objet auquel vous vous liez. A noter également que l'utilisation d'un contrôle dérivé de VirtualizingStackPanel (par exemple ListBox) plutôt que d'un ItemsControl vous obtient la virtualisation interface utilisateur gratuitement (il mettre à jour l'habitude de tous les objets de l'interface utilisateur à moins que l'utilisateur peut les voir) – Guy

+0

Je tir événement PropertyChanged avec le nom de la propriété " Couleur de fond" – Matx

Répondre

1

Si vous utilisez la virtualisation, il va seulement besoin de mettre à jour les éléments qui sont visibles - normalement contrôles articles seront uniquement le suivi des changements de propriété sur les éléments qui sont actuellement visibles. Toutefois, si vous utilisez la base ItemsControl, la virtualisation sera désactivée par défaut. Pour l'activer, vous devez fournir un modèle personnalisé qui comprend un ScrollViewer avec CanContentScroll mis à True, et vous devez également utiliser un VirtualizingStackPanel, que ce soit dans le modèle de commande, ou via le ItemsPanel - ce qui montre l'ancienne approche:

<ItemsControl ItemsSource="...whatever..."> 
    <ItemsControl.Template> 
    <ControlTemplate TargetType="ItemsControl"> 
     <ScrollViewer CanContentScroll="True"> 
     <VirtualizingStackPanel IsItemsHost="True" /> 
     </ScrollViewer> 
    </ControlTemplate> 
    </ItemsControl.Template> 
</ItemsControl> 

la virtualisation améliore les performances avec un grand nombre d'éléments de la liste de diverses façons. Cela devrait aider votre scénario, mais cela peut également améliorer d'autres aspects de la performance. Ce n'est pas sans problèmes, mais je vais certainement essayer ici avant d'essayer d'autres solutions.

0

J'ai finalement trouvé pourquoi il me fallait si longtemps pour mettre à jour mon interface utilisateur. Au fait, ce que j'essaie de faire, c'est une sorte de grille de calcul. Mon conteneur de cellules était une frontière avec les frontières visibles. Je mettais à jour la couleur d'arrière-plan du contrôle de bordure en fonction de la sélection de cellule. La désactivation des limites du contrôle Border a immédiatement résolu mon problème. Le temps de mise à jour de l'interface utilisateur est passé de 4-5 secondes à instantané.

Merci les gars pour votre réponse, je vais toujours essayer de mettre en œuvre votre suggestion pour améliorer encore plus mon projet.

Merci

Mat