2010-07-29 7 views
1

J'ai une application de liste de Windows Phone de base, avec le code comme celui-ci dans la classe MainViewModelSilverlight Windows Phone Databinding - Noob question

// CODE THAT WORKS -- 

Items.Clear(); 

foreach (var itm in e.Result) 
    Items.Add(itm); 

Count = Items.Count; 

// CODE THAT DOES NOT WORK -- I'm trying to understand WHY 

Items = e.Result; 

Le databinding Xaml ressemble à ceci:

<DataTemplate> 
    <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal"> 
     <Image x:Name="ItemImage" Source="/AppName;component/Images/ArrowImg.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
     <StackPanel> 
      <TextBlock x:Name="ItemText" Text="Event Name" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
      <TextBlock x:Name="DetailsText" Text="{Binding Path=Description}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/> 
     </StackPanel> 
    </StackPanel> 
</DataTemplate> 

I pense que j'ai un malentendu sur la façon dont ObservableCollection et INotifyPropertyChanged fonctionnent, parce que je pense que ce code devrait fonctionner. La liaison de données aux éléments NonCollection fonctionne comme je l'attendais avec mon implémentation INotifyPropertyChanged.

Répondre

5

Bien que vous n'ayez pas inclus l'extrait de code pour la propriété Items, je suppose que le problème est que vous ne déclenchez pas l'événement PropertyChanged lorsque vous modifiez la valeur de la propriété (autrement dit, la référence à un autre objet). Si vous voulez conserver le code qui ne fonctionne pas, vous devez mettre en œuvre la propriété Items comme ceci:

private IEnumerable<Item> items; 

public IEnumerable<Item> Items 
    { 
     get { return this.items; } 
     set 
     { 
      this.items = value; 
      // Call OnPropertyChanged whenever the property is updated 
      OnPropertyChanged("Items"); 
     } 
    } 

    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

Avec cette implémentation, vous avez pas besoin de la collection Items pour être un ObservableCollection, mais à chaque fois vous voudriez le modifier (en ajoutant ou supprimant des éléments), vous devriez le remplacer entièrement.

Bien sûr, vous pouvez conserver le type ObservableCollection au lieu de IEnumerable, mais tenez compte de l'enchevêtrement que ce type de collection a sur d'autres comme List ou Array.

+1

C'est à peu près juste, essentiellement ObservableCollection notifie les liaisons sur les modifications de la collection, c'est pourquoi le premier code fonctionne. Vous avez besoin de l'INPC comme mentionné ci-dessus si vous voulez remplacer la collection. Je préfère l'ancien car il peut rendre le code plus propre (avec quelques méthodes d'extension pour remplacer) –

+0

Intéressant, j'utilisais l'exemple intégré, et il utilise la définition de style "auto-propriété". Je n'ai pas eu l'idée de le changer pour utiliser l'INPC. Merci! – Nate

+0

Je pense que la chose ObservableCollection a mordu tout le monde la première fois qu'ils l'utilisent ... –

Questions connexes