【问题标题】:Binding only list items with a certain attribute仅绑定具有特定属性的列表项
【发布时间】:2013-05-27 21:15:46
【问题描述】:

我有一个ObservableCollection<MyObject>,目前在我的视图中绑定到一个ListBox。 MyObject 有一个枚举属性,我们将其称为 On 和 Off(以及其他属性)。使用绑定,有没有办法过滤集合并仅显示打开或关闭的项目?

【问题讨论】:

    标签: c# .net wpf data-binding filtering


    【解决方案1】:

    您应该看看CollectionViewSource 及其过滤功能。

    如果您想在纯 MVVM 中进行过滤,您可以让您的视图模型公开ICollectionView 类型的属性,应用您想要的任何过滤器,然后从 XAML 绑定到该属性。

    视图模型:

    public ICollectionView MyCollectionView { get; set; }
    
    public ViewModel()
    {
        var items = new List<string>
        {
            "Apple",
            "Orange"
        };
    
        MyCollectionView = CollectionViewSource.GetDefaultView(items);
    
        // Will only display items starting with "A".
        MyCollectionView.Filter = item => ((string)item).StartsWith("A");
    }
    

    XAML:

    <ListBox ItemsSource="{Binding MyCollectionView}"/>
    

    【讨论】:

    • 是否可以在纯 XAML 中过滤 CollectionViewSource 还是需要代码隐藏?
    • 您可以通过在视图模型中进行过滤来过滤纯 MVVM 中的集合,而无需隐藏代码。请参阅我的更新答案。
    • 这行得通。我将不得不尝试解决一些与我的代码相关的问题,但这无疑让我走上了正确的轨道。谢谢!
    【解决方案2】:

    您可能需要考虑collection view,或在视图模型中自己执行过滤。

    【讨论】:

    • 是否可以在纯 XAML 中过滤 CollectionViewSource 还是需要代码隐藏?
    • @DennisE:有时不这样做更容易,但是您可以在 XAML 中执行的任何操作都可以在代码隐藏中完成,反之亦然。
    • @DennisE: 一个简单的搜索就会返回这个...stackoverflow.com/questions/6461826/…
    • 我试过了,但是在&lt;CollectionViewSource.Filter&gt; 行,我得到了 2 个错误。第一个说“成员“过滤器”无法识别或无法访问。”第二个说“属性'过滤器'没有值。”
    • Filter 是一个事件 (msdn.microsoft.com/en-us/library/…),因此如果您在 XAML 中设置它,则假定处理程序存在于该文件的代码中。您应该考虑 MVVM 设计模式并最小化背后的代码,因此请查看我的答案中提供的链接,了解如何在视图模型中进行过滤。
    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多