2011-05-13 2 views
1

Mon XAML ...silverlight 4 {} liant le dictionnaire générique listbox (articles ne sont pas affichés)

<ListBox Margin="6,35,6,6" Name="lbLayers" SelectionMode="Extended" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock Text="{Binding Key,Mode=TwoWay}" /> 
       <TextBlock Text="{Binding Value.Visible,Mode=TwoWay,StringFormat='Visible: {0}'}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

.. et mon code est ...

void GameEvents_MapCreated(object sender, Zider.EventArgs.MapEventArgs e) 
    { 
     HookMapLayerEvents(false); 
     this.map = e.Map; 
     HookMapLayerEvents(true); 
     this.lbLayers.ItemsSource = this.map.Layers; 
    } 

this.map. layers est un dictionnaire générique de type (chaîne, MapLayer (Tile))

Lorsque je définis ItemSource sur la liste, il n'y a pas d'éléments dans le dictionnaire pour commencer. Lorsque je clique sur un bouton qui est quand j'ajoute une couche de carte à

this.map.Layers.Add("key", new MapLayer<Tile>()); 

également MapLayer implémente INotifyPropertyChanged pour ses propriétés.

Pour la vie de moi, je n'arrive pas à obtenir les éléments à afficher dans la liste.

Répondre

2

Le problème est que la valeur de map.Layers ne change pas et que Dictionary<TKey, TValue> n'implémente pas l'interface INotifyCollectionChanged. Il n'y a donc aucun moyen pour le ListBox de savoir que tout nouvel élément est disponible à afficher.

Si possible, modifiez la propriété Layers afin qu'elle affiche un ObservableCollection<T> à la place.

Bien sûr, cela pourrait poser problème si vous devez avoir un dictionnaire. Si vous êtes seulement intéressé à assurer des entrées uniques, vous pouvez utiliser un HastSet des clés pour gérer cela. Si vous avez besoin de la clé pour chercher, alors s'il y a peu d'éléments, une recherche séquentielle devrait raisonnablement fonctionner.

Une solution complète pourrait être d'implémenter un ObservableDictionary qui a les deux IDictionary<TKey, TValue> et INotifyCollectionChanged interfaces. Si vous recherchez "ObservableDictionary Silverlight", assurez-vous qu'ils implémentent correctement les interfaces correctes, ce n'est pas bon si c'est "observable" mais pas de manière compatible avec ItemsSource.

+0

Après un peu plus de recherche autour de je suis tombé sur cet article http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx Je définissais ItemSource à une collection qui n'a pas implémenté une interface INotifyCollectionChanged. –

Questions connexes