Я работаю над настройкой ListView, у которого для свойства Source
установлено значение ivar моего класса, называемого Cat
.
Каждый Cat
имеет ObservableCollection
из Trait
объектов:
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();
}
А затем я присваиваю Source
свойство этой коллекции Traits
:
this.CollectionViewSource.Source = CurrentCat.Traits;
Это работает правильно, и объекты Trait
правильно отображаются в моем ListView
.
Проблема заключается в том, что изменения в этой базовой коллекции _traits
не приводят к правильному обновлению пользовательского интерфейса.Например, это:
void AddTraitButton_Click(object sender, RoutedEventArgs e)
{
if (this.CurrentCat != null)
{
this.CurrentCat.AddTrait(new Trait());
}
}
Похоже, что немедленно в пользовательском интерфейсе не оказывает никакого влияния, но если я сбросил свойство Source
следующим образом:
var oldSource = this.CollectionViewSource.Source;
this.CollectionViewSource.Source = null;
this.CollectionViewSource.Source = oldSource;
Затем ListView
обновляется правильно.Но я уверен, что должно быть что-то, чего мне не хватает, поскольку я хотел бы, чтобы пользовательский интерфейс обновлялся при добавлении / удалении элемента.
Редактировать: CollectionViewSource
применяется к ListView
в моем файле XAML:
<CollectionViewSource x:Name="CollectionViewSource" x:Key="CollectionViewSource" />
...
<ListView x:Name="ItemListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...