2013-06-02 5 views
0

Cette question est probablement posée plusieurs fois auparavant mais j'ai vu tellement de réponses que je ne sais vraiment pas quoi faire.Lier ItemSource à la liste

je ListBox:

<listbox ItemSource="{Binding listitems}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <grid> 
       <Textblock text="{Binding value1}"> 
       <Textblock text="{Binding value2}"> 
      </grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</listbox> 

et j'ai une liste de la classe suivante:

List<Items> listitems = new List<Items>(); 
public class Items 
{ 
    public string value1 { get; set; } 
    public string value2 { get; set; } 
} 

Parfois, la liste est mise à jour (plus d'éléments ajoutés), et Je souhaite que la zone de liste sache que la liste est mise à jour et que l'interface utilisateur soit mise à jour en conséquence.

A ce moment, je lie manuellement la liste à la liste dans mon C#, et quand elle change, j'efface la liste et j'ajoute de nouveau la liste, ce qui n'est pas désiré.

Je me demande comment la liste peut mettre à jour automatiquement?

Répondre

0

Au lieu de List<T> générique, utilisez ObservableCollection qui implémente en interne INotifyCollectionChanged interface responsable de la mise à jour des éléments sur l'interface utilisateur.

ObservableCollection<Items> listitems = new ObservableCollection<Items>(); 

EDIT

ListItems doivent être property. Vous ne pouvez pas lier avec le champ -

ObservableCollection<Items> listitems = new ObservableCollection<Items>(); 
public ObservableCollection<Items> Listitems 
{ 
    get 
    { 
     return listitems; 
    } 
    set 
    { 
     listItems = value; 
    } 
} 

XAML -

<Listbox ItemSource="{Binding Listitems}"> 
+0

Cela ne fonctionne pas, désolé –

+0

Vous devez utiliser la propriété au lieu du champ. Voir la mise à jour Vous ne pouvez pas lier avec le champ à partir de XAML. –

+0

Jup, Votre édition fait l'affaire :) –

0

Vous devez changer la List à ObservableCollection et tout mettre en œuvre selon le modèle MVVM.

public ObservableCollection<Items> Listitems 
{ 
    get { return _listitems ; } 
    set 
    { 
     _listitems = value; 
     RaisePropertyChanged(() => Listitems); 
    } 
} 

La même chose que vous devez faire pour chacune des propriétés en Items. Utilisez également Prism pour la liaison. Vous pouvez trouver de nombreux tutoriels en ligne comme this

+0

Mm intéressant, mais y at-il un autre moyen de le faire sans un modèle MVVM? Le problème est que mon application est presque terminée et c'est l'une de mes dernières étapes .. –

+1

Mais je vais regarder dans la chose Prism et l'utiliser dans ma prochaine application :) –

0

Si vous utilisez List, vous devez notifier en utilisant INotifypropertyChanged sinon vous pouvez utiliser ObservableCollection.

devez également utiliser NotifyOnSourceUpdated = True.

+0

Lorsque j'utilise ObservableCollection listitems = new ObservableCollection (), l'interface utilisateur ne se met toujours pas à jour –

Questions connexes