【问题标题】:Filtering an ObservableCollection with CollectionViewSource yields使用 CollectionViewSource 过滤 ObservableCollection 产生
【发布时间】:2016-01-29 18:25:33
【问题描述】:

我有一个随时间变化的可观察对象集合。

ObservableCollection
    Object 1
    Object 2
    ...

我想做的是在组合框中显示此信息的过滤版本。所以我设置了一个 CollectionViewSource,它的来源是 ObservableCollection。我定义了谁的过滤器:

private const string Unknown = "Unknown";
public DevicePackageInfo()
{
    this.operatingSystemVersion = DevicePackageInfo.Unknown;
    this.packageVersionInfo = new PackageVersionInfo(DevicePackageInfo.Unknown);
    this.PackageVersionList = new ObservableCollection<PackageVersionInfo>() { new PackageVersionInfo(DevicePackageInfo.Unknown) };
    this.packageVersionCollectionView = new CollectionViewSource();
    this.packageVersionCollectionView.Filter += PackageHistoryFilter;
    this.packageVersionCollectionView.Source = this.PackageVersionList;

    this.SetSynced();
}

public void PackageHistoryFilter(object sender, FilterEventArgs e)
{
    if (e.Item != null)
        e.Accepted = ((PackageVersionInfo)e.Item).OnEAC || ((PackageVersionInfo)e.Item).SelectedOnPC;
}

问题是当我更新 ObservableCollection 时,我的组合框没有更新。

我在列表中看到的唯一对象是“未知”,这是我在构建类期间添加到列表中的第一个对象。

我的解决方案可能并不完全正确......但我很困惑。过滤后的集合源是否有内置方式订阅ObservableCollection 并保持最新状态?我该怎么做?

当我更改我的 ObservableCollection 时,我想更新绑定到我的组合框的集合。

最少的代码是理想的,我真的不想定义一个新的集合类来实现通知等。

编辑:这是我的 XAML

<ComboBox  Name="cbSelection" bhvr:SelectionChangedBehaviour.Command="{Binding PackageSelectionCommand}" ItemsSource="{Binding PackageInfo.PackageVersionCollectionView.View, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding PackageInfo.PackageVersionInfo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
                              IsSynchronizedWithCurrentItem="True">

【问题讨论】:

  • 通常当你使用 ObservableCollection 时,CollectionViewSource 会自动更新。我刚刚尝试过,我的 ComboBox 获取了我添加到 ObservableCollection 中的新对象。
  • 我就是这么想的。我最终想通了。我有很多东西被 raisepropertychanged 和 Update Handle 等处理掉了......所以我删除了所有这些,它起作用了。

标签: c# wpf mvvm


【解决方案1】:

我写这篇文章是为了让人们了解解决方案的样子:

public ObservableCollection<Tuple<String, String>> MyObservableCollection;
public CollectionViewSource MyCollectionViewSource { get; set; }

public PetViewModel()
{
    this.MyObservableCollection = new ObservableCollection<Tuple<String, String>>();
    this.MyCollectionViewSource = new CollectionViewSource();
    this.MyCollectionViewSource.Source = this.MyObservableCollection;
    this.MyCollectionViewSource.Filter += OnlyCatsFilter;

    this.MyObservableCollection.Add(new Tuple<string,string>("Paul", "Cat"));
    this.MyObservableCollection.Add(new Tuple<string,string>("Zoey", "Dog"));
    this.MyObservableCollection.Add(new Tuple<string,string>("Dude", "Turtle"));

    this.MyCollectionViewSource.View.Refresh();
}

public void OnlyCatsFilter(object sender, FilterEventArgs e)
{
    if (e.Item != null)
    {
        e.Accepted = (e.Item as Tuple<String, String>).Item2 == "Cat";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多