【发布时间】:2011-12-19 23:27:14
【问题描述】:
我正在设置一个 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 正在应用于我的 XAML 文件中的 ListView:
<CollectionViewSource x:Name="CollectionViewSource" x:Key="CollectionViewSource" />
...
<ListView x:Name="ItemListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...
【问题讨论】:
-
CollectionViewSource 是如何设置为 ListView 的?
-
@craig 关于“这是多余的吗?一个比另一个更好吗?”评论:
_traits是一个私有成员,不需要传递给OnPropertyChanged- 毕竟,它不能绑定任何东西来接收更新通知。OnPropertyChanged("Traits");就足够了。 -
@djacobson 谢谢,这有助于澄清事情。
-
this.OnPropertyChanged("Traits");在您的注释行中使用它来判断哪个更好,并且仅当您执行绑定时它看起来像 {Binding Traits} 并且绑定对象的 DataContext 设置为具有 Traits 属性的对象。
标签: c# listview microsoft-metro collectionviewsource