Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

[WPF] Comment ajouter un élément à un ItemsControl dont la propriété ItemsSource a été spécifiée ?

Il est très fréquent que l'on ait besoin, dans son programme, d'ajouter un élément à un ItemsControl (ListBox, ComboBox, etc...). Cela se passe très bien si vous avez indiqué les différents éléments du contrôle mais si vous êtes passé par la propriété ItemsSource, vous risquez d'être vite déçu.

En effet, le code suivant compile

ComboBoxItem item = new ComboBoxItem

                        {

                            Content = "Hello World"

                        };

 

this.cb.Items.Add(item);

Mais il déclenche une exception à l'exécution:

"Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead."

image

En effet, si l'on regarde la MSDN à propos de la propriété ItemsSource, voici ce que l'on peut y voir:

"When the ItemsSource property is set, the Items collection is made read-only and fixed-size."

Heureusement, il est possible de contourner ce "problème" pour arriver à ajouter notre élément manuellement.

La solution consiste tout simplement à accéder à l'objet de type IEnumerable que vous avez assigné à la propriété ItemsSource et à ajouter, sur cet objet, votre nouvel élément. Soit, par le code:

if (this.cb.ItemsSource != null)

{

    Photo p = new Photo

                  {

                      Name = "Hello World"

                  };

 

    ((ObservableCollection<Photo>) this.cb.ItemsSource).Add(p);

 

    this.cb.SelectedIndex = this.cb.Items .Count - 1;

}

De cette façon, plus aucuns problèmes ne survient mais il vous faudra faire attention à appliquer un éventuel filtre lorsque vous tenterez d'accéder à la collection car sinon, vous risquez de vous retrouver avec cet élément "temporaire" Wink

 

A+

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 29 juillet 2008 09:49 par Thomas LEBRUN
Classé sous : ,

Commentaires

richardc a dit :

Personnellement, je me demande à quoi sert Items ;-)

# juillet 29, 2008 12:22

Julien Corioland a dit :

Je cherchais justement à faire ça ce weekend...La solution tombe à pic ! Merci :)

# juillet 30, 2008 13:16

Thomas LEBRUN a dit :

@Richard: Items doit servir aux mélancoliques des WindowsForms :)

# août 1, 2008 23:45
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [MIX10] Keynote deuxième journée – Internet Explorer 9, Html5, Visual Studio 2010, OData par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 18 heures et 58 minutes

- Certifications beta .NET 4 par Kévin Gosse le il y a 19 heures et 4 minutes

- [Mix 2010] – Microsoft Translator Technology Preview V2 par RedoBlog - The .NET Gentleman !!! le il y a 19 heures et 45 minutes

- Lancement en Preview de Cyclone lors des TechDays 2010! par Blog de Frédéric Queudret le il y a 22 heures et 8 minutes

- [WP7] Je ne veux pas d’un nouvel iPhone par Le blog de FremyCompany le 03-17-2010, 13:11

- [WF4] Pourquoi utiliser le ContentPresenter dans l’ActivityDesigner? par Blog de Jérémy Jeanson le 03-17-2010, 07:54

- [Mix 2010] – Telechargez Internet Explorer 9 en Preview ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:58

- [MIX 2010] – Keynote Day 2 online : Windows Internet Explorer 9, jQuery, OData et Dallas CTP2 ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:18

- [Mix 2010] – Retour d’expérience développement Seesmic sur Windows Phone 7 par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:44

- [Mix 2010] – Le Keynote Day 1 disponible online ! par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:21