2010-08-12 2 views
1

Dans mon application silverlight i ont une vue avec une zone de liste:Mise à jour des données listbox avec RaisePropertyChanged

<ListBox Canvas.Left="12" Canvas.Top="72" Height="468" Name="invoiceList" Width="453" ItemsSource="{Binding ElementList}" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
</ListBox> 

qui est lié à la liste des éléments dans ma VM. Le problème est que quand j'ajouter de nouveaux éléments, un par un, à l'aide de commande de relais:

public RelayCommand<Element> AddNewElement = new RelayCommand<Element>(NewElement(element)); 

    public void NewElement(Element element) 
    { 
     if(ElementList == null) ElementList = new List<Element>(); 
     if (element != null) ElementList.Add(element); 
     RaisePropertyChanged("ElementList"); 
    } 

les mises à jour listbox qu'une seule fois, il ne montre que premier élément de la collection, bien que plus d'articles sont à l'intérieur ElementList

Répondre

1

Vous devez vous lier à une liste de type ObservableCollection, puis chaque mise à jour de la collection de listes déclenche la mise à jour de la liaison.

Exemple sur la façon de créer une collection observable de votre liste:

public ObservableCollection<string> MyElements { get; set; } 
public void FillList() 
{ 
    List<string> testList = new List<string>() {"string1", "string2"}; 
    MyElements = new ObservableCollection<string>(testList); 
} 

MyElements.Add("string3") déclenchera la liaison mise à jour

EDIT: J'ai ajouté un exemple de travail, je fournir le XAML et ViewModelCode avec l'utilisation de acommand ajouter quelques chaînes:

XAML:

<ListBox ItemsSource="{Binding MyStrings}" /> 
<Button Command="{Binding AddExtraStringCommand}" Content="Add ExtraString" /> 

viewmodel.cs

public class Window1ViewModel : ViewModelBase 
{ 
    public ObservableCollection<string> MyStrings { get; set; } 
    public RelayCommand AddExtraStringCommand { get; set; } 

    public Window1ViewModel() 
    { 
     patient = new Patient() { BirthdayString = "21/11" }; 
     MyStrings = new ObservableCollection<string>() { "string1", "string2", "string3" }; 
     AddExtraStringCommand = new RelayCommand(AddExtraString); 
    } 

    public void AddExtraString() 
    { 
     MyStrings.Add("nog enen extra om: " + DateTime.Now); 
    } 
} 

Je n'ai pas pour déclencher le RaisePropertyChanged pour le faire fonctionner. Peut-être que vous pouvez vérifier votre code à cet exemple de code.

+0

Merci beaucoup qui a presque résolu le problème pour moi! Mais encore après MyElements.Add ("chaîne") j'ai dû appeler RaisePropertyChanged ("PropertyName") parce que la méthode Add n'a pas déclenché la liaison à mettre à jour, et maintenant cela fonctionne bien. – tchrikch

+0

J'ai ajouté un exemple de code de travail. Essayez de vérifier votre code avec ceci parce que cela fonctionne dans un projet de test de moi –

+0

Pouvez-vous accepter cette réponse afin que la question soit marquée comme acceptée –

Questions connexes