2010-11-15 4 views
2

J'ai une propriété de type "collection observable" ... lorsque j'ajoute un élément, il ne reflète pas la géométrie dans l'interface utilisateur ... qu'est-ce qui ne va pas ...?Modification de la collection observable non reflétée dans l'interface utilisateur

<ComboBox Grid.Column="0" Grid.Row="3" 
Width="120" SelectedIndex="0" 
Margin="5,0,0,0" HorizontalAlignment="Left" 
ItemsSource="{Binding AllPlaces}" 
DisplayMemberPath="PlaceName" 
SelectedItem="{Binding Path=SelectedPlace.Value, Mode=TwoWay}" 
VerticalAlignment="Top"> 
</ComboBox> 


// Add the new item to the existing place list, so that it will be refreshed. 
ObservableCollection<PlaceDto> existingPlaceList = new ObservableCollection<PlaceDto>(); 
// Copy all places to a temperory list. 
foreach(PlaceDto placeItem in AllPlaces) 
{ 
existingPlaceList.Add(placeItem); 
} 
// Add new place to existing list 
existingPlaceList .Add(newPlace); 
AllPlaces= existingPlaceList; 
+0

s'il vous plaît montrer la liaison en xaml et vous ajoutant un élément. – Femaref

+1

Pourquoi copiez-vous tous les lieux dans une liste temporaire? ajoutez simplement la place à AllPlaces. AllPlaces.Add (newPlace). Le reste n'est pas nécessaire. et initialisez la variable AllPlaces dans le constructeur. –

Répondre

5

La fonction ObservableCollection informera l'interface graphique si la liste change. Cependant, vous modifiez la liste entière elle-même avec la ligne AllDivisions = existingPlaceList. Vous devrez implémenter INotifyPropertyChanged pour la classe qui contient la propriété AllDivisions pour indiquer à l'interface graphique lorsque vous échangez la liste.

+1

Absolument correct. Il devrait ajouter à la collection observable existante. Changer la référence ne fonctionnera pas. – Aliostad

+0

Je voulais juste ajouter un nouvel élément à la liste. Si j'utilise seulement cette ligne => AllPlaces.Add (newPlace); .. Cela fonctionnera-t-il? – Relativity

+0

@Anish: supprimez l'affectation AllPlaces = existingPlaceList et utilisez AllPlaces comme propriété publique avec getter qui retourne existingPlaceList, faites également de PlaceList une variable d'instance de classe, si vous devez la vider, utilisez Clear() au lieu de créer une liste à chaque fois . – BrokenGlass

Questions connexes