Я работаю над созданием ListView, чье свойство Source
установлено на ivar моего класса, называемого Cat
.Реализация ListView с CollectionViewSource - не освежает?
Каждого 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
обновления правильно. Но, я уверен, должно быть что-то, что мне не хватает, так как я бы хотел, чтобы пользовательский интерфейс обновлялся после добавления/удаления элемента.
Edit:CollectionViewSource
прикладывается к ListView
в моем файле XAML:
<CollectionViewSource x:Name="CollectionViewSource" x:Key="CollectionViewSource" />
...
<ListView x:Name="ItemListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...
Как установить CollectionViewSource в ListView? – Tyrsius
@ Добавлен Тирсиус. –
@craig Что касается «Это избыточно? Это лучше, чем другое?» comment: '_traits' является частным членом и не нуждается в передаче в OnPropertyChanged. В конце концов, для получения уведомления об обновлении не может быть ничего связанного с ним. 'OnPropertyChanged (« Черты »);' будет достаточно. –