WPF 多个过滤器 CollectionViewSource,添加的第一个过滤器可以正常工作,添加的第二个过滤器不能正常工作

2024-01-20

我有一个绑定到 CollectionViewSource 的 ListView。我按照这篇文章(很多人参考过)进行了多重过滤:http://www.zagstudio.com/blog/456#.UG8r6E1lWLE http://www.zagstudio.com/blog/456#.UG8r6E1lWLE

我设置了两个用于测试的复选框,除了添加过滤器之外什么也不做。每当我首先单击其中一个时,过滤器就会添加到 CollectionViewSource 中并且可以正常工作。然后,当我单击相反的复选框时,而不是将其他过滤器添加到 CollectionViewSource 并且两个过滤器都工作,我的列表视图变为空白(当它不应该基于数据时,并且这种情况以检查我的复选框的任一顺序发生)

这是相关代码:(背景:该应用程序处理运输软件的“订单”过滤)

装载订单:

public class Order
{
    public int index { get; set; }
    public string host { get; set; }
    public Int64 orderNumber { get; set; }
    public string batchStatus { get; set; }
    public string sku { get; set; }
    public int numItems { get; set; }
    public string orderSource { get; set; }
    public string sourceOrderNumber { get; set; }
    public DateTime orderDate { get; set; }
    public DateTime orderTime { get; set; }
    public int customerID { get; set; }
    public string shipMethod { get; set; }
    public string billingState { get; set; }
    public bool statusChanged { get; set; }
    public int numSkus { get; set; }
    public string marketName { get; set; }
    public float weight { get; set; }
}

public class Orders : ObservableCollection<Order>
{
    public Orders()
    {
        SqlDataReader reader1 = cmd.ExecuteReader();
        while (reader1.Read())
        {
            Order order = new Order();

            order.host = (string)safeGetString(reader1, 0);
            order.orderNumber = (Int64)reader1["OrderNumber"];
            order.batchStatus = (string)safeGetString(reader1, 2);
            order.orderSource = (string)safeGetString(reader1, 3);
            order.sourceOrderNumber = safeGetString(reader1, 4);
            order.orderDate = (DateTime)reader1["OrderDate"];
            order.customerID = (int)reader1["CustomerID"];
            order.shipMethod = (string)safeGetString(reader1, 7);
            order.billingState = (string)safeGetString(reader1, 8);
            order.numItems = (int)reader1["NumItems"];
            order.numSkus = (int)reader1["NumSKUs"];
            order.marketName = (string)safeGetString(reader1, 11);
            order.weight = (float)(double)reader1["ShippedWeight"];


            this.Add(order);
        }
        reader1.Close();
    }

设置 CollectionViewSource:

cvs = (CollectionViewSource)(this.Resources["cvs"]);

复选框功能:(使用filterString硬编码“过滤内容”进行测试)

public void checkBox2_Checked(object sender, RoutedEventArgs e)
    {
        filterString = "TX";
        cvs.Filter += new FilterEventHandler(billingStateFilter);
    }
    public void checkBox1_Checked(object sender, RoutedEventArgs e)
    {
        filterString = "Standard";
        cvs.Filter += new FilterEventHandler(shippingMethodFilter);
    }

最后,过滤器:

private void shippingMethodFilter(object sender, FilterEventArgs e)
    {
        Order order = e.Item as Order;
        if ((order.shipMethod != filterString))
        {
            e.Accepted = false;
        }
    }

    public void billingStateFilter(object sender, FilterEventArgs e)
    {
        Order order = e.Item as Order;
        if ((order.billingState != filterString))
        {
            e.Accepted = false;
        }
    }

就像我说的,第一个过滤器总是有效的。第二个总是使屏幕空白。有任何想法吗?


您正在为两个过滤器重复使用过滤字符串,并且一旦选中每个框both将应用过滤器。所以如果你:

  1. 选中checkBox1,然后filterString将为“Standard”,并且shippingMethodFilter将被挂接。
  2. 检查checkBox2,然后filterString将为“TX”并且billingStateFilter将被挂接。

ShippingMethodFilter 永远不会脱钩。所以它会继续基于“TX”的filterString进行过滤。

您可能应该添加一个过滤器方法来检查 checkBox1/checkBox2 是否被选中,然后选择性地应用它的过滤逻辑。就像是:

private string shippingFilterString = "Shipping";
private string billingFilterString = "TX";

private void collFilter(object sender, FilterEventArgs e)
{
    Order order = e.Item as Order;
    if (checkBox1.IsChecked == true && (order.shipMethod != shippingFilterString ))
        e.Accepted = false;
    if (checkBox2.IsChecked == true && (order.billingState != billingFilterString ))
        e.Accepted = false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 多个过滤器 CollectionViewSource,添加的第一个过滤器可以正常工作,添加的第二个过滤器不能正常工作 的相关文章

  • 使用 TemplateColumns 将 WPF DataGrid 绑定到 DataTable

    我已经尝试了一切但一无所获 所以我希望有人能给我一个顿悟的时刻 我根本无法获得成功提取数据网格中数据的绑定 我有一个包含 MyDataType 的多列的 DataTable public class MyData string nameDa
  • WPF;单击 ListView 中的空白区域时如何取消选择所有选定的项目

    当我有几个 甚至一个 selected items我按简单click在我的空白处ListView 空白 非行 我想取消选择所有选定的项目 这是我取消选择所有项目的功能 private void DeselectAllListViewItem
  • MultiDataTrigger 使用 OR 而不是 AND

    我正在尝试设置多个DataTriggers on my Button 我做了一些研究发现MultiDataTrigger允许您执行此操作 我想要Visibility我的财产Button如果设置为 falseCCTVPath string E
  • 如何在 WPF 中实现虚线或点线边框?

    我有一个ListViewItem我正在申请Style到 我想把灰色虚线作为底部Border 我怎样才能在 WPF 中做到这一点 我只能看到纯色画笔 这在我们的应用程序中效果很好 允许我们使用真正的边框而不是乱用矩形
  • 转换BitmapImage后内存未释放

    我遇到以下 C 测试 代码的问题 public static void TestBitmap2ByteArray BitmapImage bitmap JpegBitmapEncoder encoder new JpegBitmapEnco
  • 滚动 X 轴绘图区域 - Silverlight 柱系列

    我有一个工作正常的柱形系列图表 我有一个需要添加的功能 我希望水平滚动能够启用到 x 轴的绘图区域 这是屏幕截图 如果您看到屏幕截图 我有 6 个项目 并且由于项目数量较多 条形图非常细 所以假设如果我有 20 个项目 那么条形图将根本不可
  • 即使在 GC Collect 和 WaitForPendingFinalizers 之后,窗口对象在关闭后也未释放?

    这是一个简单的测试应用程序 可帮助了解 WPF 内存使用情况 我想了解的关键是为什么MainWindow即使在关闭并等待 GC 完成之后 仍然被引用并且它的内存没有被释放 参见下面的代码清单 文本 MainWindow Finalizer
  • 获取代码中的绑定结果

    我可能正在以错误的方式寻找这个 但是 有没有办法通过代码获取绑定的结果值 可能是一些显而易见的东西 但我就是找不到它 您只需致电ProvideValue的绑定方法 困难的部分是你需要通过有效的IServiceProvider到方法 编辑 实
  • 重写 WPF 工具包图表中的 DataPointStyle

    我想覆盖DataPointStyle of the LineSeries在我的 WPF 工具包中Chart
  • 如何在Wpf中的用户控件中调用MahApps Metro对话框

    当我尝试调用 MahApps Metro 对话框时 我在传递值时遇到错误 在传递参数时调用对话框控制时我需要传递 Metrowindow 参数 但我需要在用户控件中调用它 下面是当我需要对话框控制时我将调用的方法 public async
  • 无法使用 DialogResult

    我尝试使用DialogResult检查一个Messagebox s 是 否 取消 我正在使用以下代码 我没有看到任何问题 DialogResult dlgResult MessageBox Show Save changes before
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 如何使 WPF 应用程序在 Web 浏览器上运行

    我们有一个用 WPF 编写的现有应用程序 我们正在寻找一种迁移它的方法 以便它可以在 Web 浏览器上运行 深入研究后 我们似乎需要找到一种将代码编译为 WebAssembly 的方法 但我不确定它对于现有的完全加载的 WPF 应用程序有多
  • 先学Silverlight还是先学WPF?

    看来 Silverlight WPF 是 NET 用户界面开发的长期未来 这很棒 因为我可以看到在客户端和 Web 开发端重用 XAML 技能的优势 但看看 WPF XAML Silverlight 它们似乎是非常庞大的技术 那么从哪里开始
  • Flash AS3 EventDispatcher - 有什么方法可以获取已注册侦听器的列表吗?

    有没有什么方法可以获取注册监听器的列表EventDispatcher 我知道EventDispatcher有hasEventListener方法告诉您是否注册了任何侦听器 但是有没有一种简单的方法来询问EventDispatcher找出听众
  • WPF 处理文本、图像和文件粘贴事件

    我正在开发一个 WPF 应用程序 我想捕获 RichTextBox 输入中的粘贴命令并处理粘贴的文件 为此 我使用以下回调
  • WPF - 如何从 DataGridRow 获取单元格?

    我有一个具有交替行背景颜色的数据绑定 DataGrid 我想根据单元格包含的数据对单元格进行不同的着色 我已经尝试过该线程建议的解决方案 http wpf codeplex com Thread View aspx ThreadId 511
  • 混合 MFC 和 WPF:模态对话框

    我使用 C CLI 界面层将 C WPF 对话框添加到现有的 C MFC 应用程序 我一切正常 只是我遇到了形式问题 例如 MFC 应用程序使用 ShowDialog 显示 WPF 对话框 按预期工作 该 WPF 对话框显示使用 DoMod
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表

随机推荐