【问题标题】:WPF Binding to a Combo using only a subset of a Collection's items仅使用集合项的子集的 WPF 绑定到组合
【发布时间】:2010-10-26 22:06:39
【问题描述】:

我正在尝试将 TwoWay 绑定设置为仅使用选择的集合对象的组合框。目前,如果我只想绑定集合中的所有内容,一切正常,但在下面的示例类中,如果我只想显示 Active=True 的项目怎么办?我可以使用 LINQ 过滤项目,例如 ItemsSource = FROM x IN Coll WHERE x.Active=True 但随后我失去了 TwoWay 绑定。即,如果源中的名称或活动状态是从其他地方更新的,则组合框不会自动更新。

有可能吗?如果没有,是否有人不得不处理这个问题有一些建议?

'The Class
Public Class Test
    Implements ComponentModel.INotifyPropertyChanged

    Private _Name As String
    Private _Active As Boolean

    Public Sub New(Name As String, Active As Boolean)
        _Name=Name
        _Active=Active
    End Sub

    Public Property Name() As String
End Class



'Declare a Collection and add some Tests, then bind to Cbo in Page Load
Dim Coll As New ObservableCollection
Coll.Add(New Test("Test1", True))
Coll.Add(New Test("Test2", False))
Coll.Add(New Test("Test3", True))
TheComboBox.ItemsSource=Coll

【问题讨论】:

    标签: wpf binding combobox observablecollection


    【解决方案1】:

    两种选择:

    您可以使用像 Bindable LINQ 这样的框架,让您的 LINQ 查询返回可观察的集合(因此绑定保持双向)。

    或者您可以将 ComboBox 的项目绑定到 CollectionViewSource 并通过 Filter 事件处理程序运行每个项目:

    <CollectionViewSource
        Source="{Binding MyItems}"
        Filter="OnlyActiveItems"
        x:Key="ItemsView"/>
    
    <ComboBox ItemsSource="{Binding Source={StaticResource ItemsView}}" />
    

    使用代码隐藏:

    private void OnlyActiveItems(object sender, FilterEventArgs e)
    {
        e.Accepted = false;
    
        var item = e.Item as Text;
        if (item == null) return;
    
        e.Accepted = item.Active;
    }
    

    请注意,我不完全确定 CollectionViewSource 是否会识别 INotifyPropertyChanged 接口并在一个元素更改时重新查询列表。如果过滤方法不起作用,我真的建议使用 Bindable LINQ。

    【讨论】:

    • 是的,我自己并没有真正尝试过,但我确实在某个地方遇到了另一个帖子,上面说 View 将失去 ChangeEvent 传播。但是,即使 Views 确实有效,我也很感谢学习 Bindable LINQ。这对未来也肯定有很大的帮助。谢谢马特!
    • 这似乎并不完全正确:man page on CollectionViewSource 明确指出,“如果源集合实现 INotifyCollectionChanged 接口,则由 CollectionChanged 事件引发的更改将传播到视图。”
    【解决方案2】:

    CollectionViewSource 类可以为任何 WPF 项目控件添加排序和过滤

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2023-03-15
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多