我正在设置一个 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
集合的更改不会导致 UI 正确更新。例如,这个:
void AddTraitButton_Click(object sender, RoutedEventArgs e)
{
if (this.CurrentCat != null)
{
this.CurrentCat.AddTrait(new Trait());
}
}
在 UI 中似乎没有立即Source
产生任何影响,但是如果我像这样重置属性:
var oldSource = this.CollectionViewSource.Source;
this.CollectionViewSource.Source = null;
this.CollectionViewSource.Source = oldSource;
然后ListView
正确更新。但是,我确定一定有一些我遗漏的东西,因为我希望 UI 在添加/删除项目时更新。
编辑:正在CollectionViewSource
应用于ListView
我的 XAML 文件中:
<CollectionViewSource x:Name="CollectionViewSource" x:Key="CollectionViewSource" />
...
<ListView x:Name="ItemListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...