使用CollectionViewSource for SelectedItem.ObservableCollection

时间:2015-11-17 10:02:17

标签: c# wpf listview mvvm collectionviewsource

我正在尝试让CollectionViewSource用于SelectedItem对象的ObservableCollection,但我没有得到我所期待的。 ListView没有使用SelectedItem属性更改更新的项目。

我有一个带有ObservableCollection<Car> Cars对象的SelectedCar,该对象绑定到附加ObservableCollection的ListView的SelectedItem属性。一切都很好。

Car类有一个ObservableCollection<string> Tyres,这是感兴趣的对象。

从这里开始,我想将另一个ListView的ItemsSource绑定到SelectedCar.Tyres对象。最初SelectedCar为空,因为原始Cars ListView中没有选择任何内容。我在这里使用ICollectionView的原因是因为我需要在Tires 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 setter的代码时,我可以看到ICollectionView确实显示了value.Tyres中的项目,只是这些值没有出现在ListView中。

我无法在MainViewModel的构造函数中初始化yCollectionView,因为在此阶段,SelectedCar对象仍然为空,执行CollectionViewSource.GetDefaultView(this.SelectedCar.Tyres)之类的操作会抛出NullReferenceException

任何人都可以指导我这个问题吗?非常感谢:)

1 个答案:

答案 0 :(得分:1)

根据评论,答案是NotifyPropertyChanged属性的实现YCollectionView

private ICollectionView tyreCollectionView;    
public ICollectionView TyreCollectionView
{
    get
    {
        return this.tyreCollectionView;
    }
    set
    {
        this.tyreCollectionView = value; NotifyPropertyChanged( "TyreCollectionView" );
    }
}

#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected void NotifyPropertyChanged( String info )
{
    if ( PropertyChanged != null )
    {
        PropertyChanged( this, new PropertyChangedEventArgs( info ) );
    }
}