2010-11-18 11 views
0

Voici mon code:WPF DataGrid n'est pas rendu correctement après la modification sous-jacente collection

<Grid> 
    <Button Content="Button" Click="button1_Click" /> 
    <DataGrid ItemsSource ="{Binding Lst}" /> 
</Grid> 

code-behind:

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     (this.DataContext as Some).remove(); 
    } 

DataSource est:

public class Some : INotifyPropertyChanged 
{ 
    private List<Point> lst = new List<Point>(); 
    public List<Point> Lst 
    { 
     get 
     { 
      return lst; 
     } 
    } 

    public Some() 
    { 
     lst.Add(new Point(2.3, 5)); 
     lst.Add(new Point(267.3, 5)); 
     lst.Add(new Point(2.3, 65)); 
     lst.Add(new Point(2.63, 885)); 
     lst.Add(new Point(27.3, 65)); 

    } 
    public void remove() 
    { 
     lst.Remove(lst.Last()); 
     if (PropertyChanged != null) 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Lst")); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Quand j'appelle remove() méthode , je supprime l'élément de la collection et invoque propertychanged. La réaction de l'interface utilisateur est: je ne peux pas sélectionner correctement les cellules dans le DataGrid qui correspondent à Point. Ils sont et non supprimés. Cela ressemble à un bug de l'interface utilisateur, existe-t-il une solution de contournement?

Désolé pour c'est si sale - juste un échantillon rapide.

Merci, Ilya

Répondre

2

Utilisation ObservableCollection<> au lieu de List<> pour LST - l'ObservableCollection avertit automatiquement lorsque les changements de collecte par ajoute, supprime ou efface. Vous aurez également besoin d'un DependencyProperty: http://forums.silverlight.net/forums/t/12664.aspx

+0

Merci! Maintenant, je sais ce que ObservableCollection est utilisé pour :) –

+0

La propriété de dépendance n'est pas nécessaire. Vous pouvez utiliser le modèle de vue simplement en implémentant les interfaces INotifyPropertyChanged et INotifyCollectionChanged. – Bulat

1

Je cas de liaison ItemSource à un modèle de vue, votre collection devrait implémenter INotifyCollectionChanged. Le ObsevableCollection est en fait la collection qui implémente INotifyCollectionChanged, notifiant ainsi les contrôles WPF des éléments ajoutés et supprimés.