【问题标题】:Binding to a CollectionViewSource Question绑定到 CollectionViewSource 问题
【发布时间】:2011-07-17 06:58:09
【问题描述】:

我的问题是这样的:

我有 2 个列表框:

一个绑定到一个名为 Photos 类型的照片的集合,另一个绑定到一个 CollectionViewSource,后者绑定到同一个照片集合。

listBox1 -> photos(这里 listBox1 绑定到照片的默认 CollectionView,当然不是直接绑定到照片。)

ListBox2 -> cvs -> 照片

两个集合(默认集合和我的 CVS)都有一个过滤器,可以将它们显示的项目从 8 个项目减少到 5 个项目。

现在我有 2 个标签。一个绑定到 photos 对象的 Count 属性,另一个绑定到 Count 属性,其中源是 cvs(我的 CollectionViewSource)对象。

第一个标签显示数字 8,正如我所见,这是因为即使我正在过滤它的默认 CollectionViewSource,照片的数量仍为 8。

第二个标签显示数字 5。

我了解到绑定到 cvs 是 WPF 从 cvs 中解包源对象,并且 Path=Count 与底层对象相关,即照片,这里的数字也应该是 8。

谁能解释一下我穿在哪里?

谢谢!

【问题讨论】:

    标签: wpf data-binding collectionviewsource


    【解决方案1】:

    绑定不会绑定到源集合而是视图。集合视图还有一个 Count 属性,它返回(过滤的)视图中的项目数,而不是原始集合中的项目数。

    (您可以使用调试器查看CollectionViewSourceView 属性通常是一个对象,它是CollectionView 或其子类之一的实例。绑定将隐式绑定到View.Count)

    要绑定到原始计数,请使用路径SourceCollection.Count

    【讨论】:

    • 1) 我们谈论的是 CollectionViewSource 对象,而不是他,也不是 CollectionViewSource.View 确实有 Count Propery 2) 当你想绑定到 Wrapper 对象的属性时(在这种情况下是 CollectionViewSource 对象)您将绑定对象中的 BindsDirectlyToSource 设置为 true。这意味着我们不想从 CVS 对象中解开我们的源对象,我们想绑定到 CVS 对象上的属性 3) 我在 Nathan Adam 的 WPF Unleashed 一书中读到了它。
    • 嗯,问题是集合视图的默认接口 (ICollectionView) 没有任何计数属性,但对于大多数源集合,您最终会得到一个实现。因此,显示的这个计数确实来自我在答案中链接到的属性,因为绑定隐式绑定到通常只存在的View.Count。即使你绑定到IEnumerable,绑定系统也会在它周围创建一个IList,所以即使那样,视图中也可能会有一个计数。
    • 会有一个 count 属性也可以从以下事实中推断出来:1.您不自己创建视图 2.框架中只有一个类实现了ICollectionView,即CollectionView,里面有说属性。
    • 你似乎不明白我在说什么,我很久以前就回答了:它们不绑定到同一个属性,它隐式绑定到View.Count,这 不是与源的计数相同,因为它考虑了过滤器。您可以使用BindsDirectlyToSourceSource.Count,也可以采用默认行为并通过将路径设置为SourceCollection.Count 从视图中获取集合。
    • 如果BindsDirectlyToSource 关闭,它会绑定到视图,而不是源集合。
    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2013-06-12
    • 2017-08-26
    相关资源
    最近更新 更多