【发布时间】:2015-11-17 10:02:16
【问题描述】:
我正在尝试让 CollectionViewSource 为 SelectedItem 对象的 ObservableCollection 工作,但我没有得到我期望的结果。 ListView 没有随着 SelectedItem 属性更改而更新的项目。
我有一个 ObservableCollection<Car> Cars 和一个 SelectedCar 对象,该对象绑定到 ObservableCollection 附加到的 ListView 的 SelectedItem 属性。这里一切都很好。
Car 类有一个 ObservableCollection<string> Tyres,这是这里感兴趣的对象。
从这里开始,我想将另一个 ListView 的 ItemsSource 绑定到 SelectedCar.Tyres 对象。最初,SelectedCar 为 null,因为在原始 Cars ListView 中没有选择任何内容。我在这里使用 ICollectionView 的原因是因为我需要在轮胎 ListView 上进行过滤。
在我的 ViewModel 中,我已将 ICollectionView 声明为:
private ICollectionView tyreCollectionView;
public ICollectionView TyreCollectionView
{
get
{
return this.tyreCollectionView;
}
}
并且,在 SelectedCar 的 Setter 中,我这样做:
this.tyreCollectionView = CollectionViewSource.GetDefaultView(value.Tyres);
this.tyreCollectionView.Filter += this.FilterByTyreName;
对于 XAML,有问题的 ListView 绑定到 ICollectionView,如下所示。
<ListView ItemsSource={Binding YCollectionView}/>
我也试过打电话给this.tyreCollectionView.Refresh(),但这也无济于事。 ListView 没有填充任何结果。当我尝试调试 SelectedCar 设置器的代码时,我可以看到 ICollectionView 确实显示了 value.Tyres 中的项目,只是这些值没有出现在 ListView 中。
我无法在 MainViewModel 的构造函数中初始化 yCollectionView,因为在那个阶段,SelectedCar 对象仍然为空,并且执行类似 CollectionViewSource.GetDefaultView(this.SelectedCar.Tyres) 之类的操作会抛出 NullReferenceException。
谁能指导我解决这个问题?非常感谢:)
【问题讨论】:
-
YCollectionView属性设置器是否包含NotifyPropertyChanged实现?或许你可以尝试直接在SelectedCar的setter中为轮胎设置ListView的ItemsSource。 -
您好,感谢您的回复。目前我还没有为 YCollectionView 实现属性更改通知程序。明天我上班的时候我会试试看:)
-
嗨,那好吧,如果有帮助就写)
-
当然,我明天会带着结果回来 :)
-
嘿伙计,你的建议是正确的!我的 ICollectionView 现在可以正确更新。如果您想发布答案,请这样做,我会接受它作为答案。 :)
标签: c# wpf listview mvvm collectionviewsource