【问题标题】:How to add Filtering to Josh Smith's MVVM msdn design如何在 Josh Smith 的 MVVM msdn 设计中添加过滤
【发布时间】:2014-01-26 02:06:49
【问题描述】:

我模仿了 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx 的 Josh Smith 的设计,想添加过滤功能。

在 AllCustomersViewModel 中,他创建了一个 CustomerViewModel 的 ObservableCollection,它通过属性 AllCustomers 链接到 xaml

public ObservableCollection<CustomerViewModel> AllCustomers { get; private set; }

在 xaml AllCustomers 中设置为 CollectionViewSource。

说到这里,我想就如何扩展此功能以包括过滤提出建议。我不担心 xaml 方面的事情,更多的是在 ViewModel 中实现它。

【问题讨论】:

    标签: c# wpf xaml mvvm


    【解决方案1】:

    实际上,您根本不需要在 XAML 中定义 CollectionViewSource。这一切都可以在您的 ViewModel 中完成。

    直接将集合绑定到 XAML 中的 ListBox:

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

    在 ViewModel 中,您可以通过获取与您的集合相关的默认 CollectionView 来应用 过滤器,如下所示:

    ICollectionView defaultCollectionView = CollectionViewSource
                                           .GetDefaultView(AllCustomers);
    defaultCollectionView.Filter = p => ((CustomerViewModel)p).IsCompany;
    

    假设IsCompany 是一个布尔属性。过滤器接受谓词(您可以将其替换为任何返回 bool 的委托)。

    顺便说一句,您还可以从 ViewModel 本身应用排序和分组。


    如果您想在 XAML 中使用 CollectionViewSource,您可以在代码隐藏中应用过滤器。

    <CollectionViewSource x:Key="MyCVS"
                          Source="{Binding AllCustomers}"
                          Filter="MyCVS_Filter"/>
    

    在后面的代码中:

    void MyCVS_Filter(object sender, FilterEventArgs e)
    {
        CustomerViewModel item = e.Item as CustomerViewModel;
        if (item.IsCompany)
        {
            e.Accepted = true;
        }
        else
        {
            e.Accepted = false;
        }
    }
    

    【讨论】:

    • 谢谢。我也计划使用弹出窗口进行过滤,我正在考虑只为我的所有列使用一个通用弹出窗口。将有一个带有复选框的不同值列表,这些值将根据被过滤的列而变化。这就是为什么我在另一个问题中询问获取列绑定属性名称的参数的原因。不知何故为每一列创建一个单独的过滤器似乎太复杂了。您将如何进行?
    • 我会澄清一点,我希望创建一个通用过滤器,为我的每一列动态加载值。
    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多