【问题标题】:Using CollectionViewSource for SelectedItem.ObservableCollection对 SelectedItem.ObservableCollection 使用 CollectionViewSource
【发布时间】: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


【解决方案1】:

根据 cmets 的回答,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 ) );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2017-02-17
    • 2014-09-27
    相关资源
    最近更新 更多