2010-07-15 4 views
4

Hai suis wpf zone de liste, je ne peux pas effacer la liste lorsque j'appelle la fonction de rechargement de données, je veux juste recharger de nouvelles données à l'exécution, tandis que le chargement de la page charge correctement les données récupéré dans itemsource je peux voir que dans le mode débogage, mais pas de nouvelles données dans la liste, les anciennes données restent dans la liste, je ne peux même pas clair, quand j'appelle list.items.clear(), il jette l'exception et l'application se bloque, j'ai essayé Beaucoup de façons, il ya un problème dans ma liaison XAML, ce qui suit est mon code.Comment effacer la liste déroulante WPF?

<DataTemplate x:Key="listBoxTemplate"> 
       <StackPanel Margin="3"> 
        <DockPanel > 
         <TextBlock FontWeight="Bold" Text="{Binding Name}" DockPanel.Dock="Left" Margin="5,0,10,0"/> 
         <TextBlock Text=" " /> 
         <TextBlock Text="{Binding Percnt}" Foreground="Green" FontWeight="Bold" /> 
        </DockPanel>      
       </StackPanel> 
      </DataTemplate> 

Mon listbox

<ListBox Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/> 

Code Reliure

lstEntity.ItemsSource = sei.getNames(); 

fonction getNames() retourne juste les données sous forme de liste, rien code spécial qui, Comment résoudre ce problème.

+0

Quelles sont les exceptions que vous obtenez lorsque vous essayez de supprimer la zone de liste et de définir sa ItemsSource à null? Utilisez-vous d'autres threads? – Amsakanna

Répondre

4

La meilleure façon d'obtenir ce type de comportement est d'utiliser un DependencyProperty et fixations.

Dans votre fichier de classe créer le DP comme ceci:

#region MyList dependency property 
    public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(ObservableCollection<String>), typeof(Window1)); 

    public ObservableCollection<String> MyList 
    { 
     get { return (ObservableCollection<String>) GetValue(MyListProperty); } 
     set { SetValue(MyListProperty, value); } 
    } 
    #endregion 

Puis, en vous XAML lier à cette DP comme ceci:

<ListBox ItemSource={Binding Path=MyList, ElementName=MyWindow} Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/> 

Où "MyWindow" est le x: Nom du root window dans votre fichier XAML (vous pouvez bien sûr utiliser datacontext comme le modèle MVVM :)

Ensuite, si vous voulez ajouter/supprimer des éléments de votre code, il vous suffit d'accéder directement à la liste:

MyList.Clear(); 
MyList.Add("My New String"); 

Vous, bien sûr, aussi besoin de changer le type générique de la collection d'être votre propre classe ...

1

Est-ce que vous (jamais) peuplez la ListBox en ajoutant directement à la collection Items ou simplement via ItemsSource?

Si ce dernier, définissez ItemsSource sur null et définissez-le à recharger.

+1

si je définis la valeur NULL, l'opération s'exécute sous la forme "L'opération n'est pas valide lorsque ItemsSource est en cours d'utilisation.Accédez et modifiez les éléments avec ItemsControl.ItemsSource à la place." ça ne marche pas non plus .. ???? –

+0

ne pas ajouter directement, juste en ajoutant par itemsource seulement –

+0

Je suis à court d'idées alors désolé. –

0

Si vous utilisez le modèle MVVM, ajoutez une propriété à votre ViewModel:

public IEnumerable Names { 
    get { return sei.getNames() as IEnumerable; } 
} 

Ensuite, dans votre XAML, ItemsSource de code comme ceci:

<ListBox ... ItemsSource="{Binding Names}" ... /> 

À chaque fois que le contenu de votre liste des changements de noms, déclenche l'événement PropertyChanged; ceci indiquera le système WPF pour vous rafraîchir ListBox:

PropertyChanged(this, new PropertyChangedEventArgs("Names"); 
+0

ne pas utiliser le modèle MVVM. juste la liaison normale –

+0

Ensuite, implémentez cette propriété et l'interface INotifyPropertyChanged directement sur votre classe, si vous le pouvez. –

1

Ne peut pas dire quelle est la cause de la question dans votre cas jusqu'à ce que vous donnez l'exception et d'autres détails. Cependant, suggérant la meilleure façon de faire la chose.

  1. Laissez votre méthode getnames renvoyer un IEnumerable.
  2. Construire une ObservableCollection à partir de celle-ci.
  3. Réglez le ItemsSource au ObservableCollection créé

Maintenant, vous pouvez modifier votre ObservableCollection pour voir les changements dans la liste.

1

Avant de faire ceci:

lstEntity.ItemsSource = sei.getNames(); 

Effacer la ItemsSource listbox:

lstEntity.ItemsSource = ""; 
+0

Cela va lancer exactement la même exception que s'il le mettait à null. –