Die Umsetzung einer ListView mit einer CollectionViewSource - Nicht Erfrischend?

Arbeite ich am Aufbau einer ListView, deren Source - Eigenschaft auf eine ivar von einer Klasse von mir, genannt Cat.

Jeder Cat hat eine ObservableCollection von Trait Objekte:

private ObservableCollection<Trait> _traits = new ObservableCollection<Trait>();

public ObservableCollection<Trait> Traits
{
get
    {
        return _traits;
    }
}

public void AddTrait(Trait t)
{
    _traits.Add(t);
    //Is this redundant? Is one better than the other?
    this.OnPropertyChanged("_traits");
    this.OnPropertyChanged("Traits");
}

public IEnumerator<Object> GetEnumerator()
{
    return _traits.GetEnumerator();
}

Ist und dann bin ich die Zuordnung der Source Eigenschaft dieser Traits Sammlung:

this.CollectionViewSource.Source = CurrentCat.Traits;

Dies korrekt funktioniert, und die Trait Objekte werden richtig angezeigt in meinem ListView.

Das Problem ist, dass änderungen dieser zugrunde liegenden _traits Sammlung nicht bewirken, dass das UI richtig aktualisiert. Zum Beispiel diese:

void AddTraitButton_Click(object sender, RoutedEventArgs e)
{
    if (this.CurrentCat != null)
    {
        this.CurrentCat.AddTrait(new Trait());
    }
}

Nicht scheinen, um eine Wirkung sofort in der Benutzeroberfläche, aber wenn ich einen reset der Source - Eigenschaft, etwa so:

var oldSource = this.CollectionViewSource.Source;
this.CollectionViewSource.Source = null;
this.CollectionViewSource.Source = oldSource;

Dann die ListView korrekt aktualisiert. Aber ich bin sicher, es muss etwas sein, das mir fehlt, wie ich möchte, dass das UI-update auf die addition/entfernen einer Sache.

Edit: Die CollectionViewSource angewendet wird, um die ListView in meiner XAML-Datei:

<CollectionViewSource x:Name="CollectionViewSource" x:Key="CollectionViewSource" />

...

<ListView x:Name="ItemListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...
  • Wie ist die CollectionViewSource gesetzt, um die ListView?
  • Hinzugefügt.
  • In Bezug auf die "Ist das überflüssig? Ist einer besser als der andere?" - Kommentar: _traits ist eine private-Mitglied sind und nicht übergeben werden müssen, um OnPropertyChanged - nachdem alle, es könnte nicht alles, was gebunden ist an die update-Benachrichtigung erhalten. OnPropertyChanged("Traits"); genügt.
  • Danke, das hilft klären die Dinge.
  • diese.OnPropertyChanged("Traits"); Verwenden Sie dies auf Ihr Kommentar über, was besser ist, und nur wenn, wenn Sie tun, eine Bindung wie es aussieht {Binding Merkmale} und das gebundene Objekt DataContext gesetzt ist, um das Objekt mit den Eigenschaften Eigenschaft.
InformationsquelleAutor Craig Otis | 2011-12-19
Schreibe einen Kommentar