【问题标题】:Filter ListView with multiple enum使用多个枚举过滤 ListView
【发布时间】:2018-10-11 21:07:56
【问题描述】:

我正在尝试使用复选框过滤器过滤 ListView,并将这些过滤器应用于枚举。它适用于一个过滤器,但不适用于组合。 枚举具有所有值的 2 次幂和 [Flags] 属性。 这是我的代码:

int statuses = 0;
        if ((bool)Filter1CB.IsChecked)
        {
            statuses++;
        }
        if ((bool)Filter2CB.IsChecked)
        {
            statuses += 2;
        }
        if ((bool)Filter3CB.IsChecked)
        {
            statuses += 4;
        }
        if ((bool)Filter4CB.IsChecked)
        {
            statuses += 8;
        }
Sp.Filter = item =>
            {
                return item is Sp sp && sp.CurrentStatus == (SpStatus)statuses;
            };

我检查了,检查过滤器 1 和 2 时 statuses 的值为 3,依此类推。但它没有应用任何过滤器...
这是我的枚举:

[Flags]
    public enum SpStatus
    {
        Filter1 =   1 << 0,   
        Filter2 =   1 << 1,  
        Filter3 =   1 << 2,    
        Filter4 =   1 << 3,    

    }

【问题讨论】:

    标签: c# wpf listview enums


    【解决方案1】:

    您的过滤器需要测试传入的项目是否与所有指定的标志匹配。因此,使用逻辑 AND 来提取过滤标志。然后与过滤器标志进行比较,确保我们只对设置了所有标志的项目感兴趣。

    Sp.Filter = item =>
    {
        Sp sp = (Sp)item;
        return (sp.CurrentStatus & (SpStatus)statuses) == (SpStatus)statuses;
    };
    

    【讨论】:

    • 感谢您的回答。结果相同,适用于一个过滤器,而不适用于组合。
    • 在 lambda 中设置一个断点并检查您是否从前面的代码中设置了正确的状态,因为这个 lambda 肯定按预期工作。
    • 真正奇怪的是 lambda 似乎完全没问题,即使有断点,我似乎也没有错误......但调试器告诉我 (sp.CurrentStatus &amp; (SpStatus)statuses) == (SpStatus)statuses 是错误的。即使在状态中我可以在调试器中看到与我检查过的两个状态完全相同的状态,并且 sp.CurrentStatus 是这两个状态之一......
    • 你的答案哪里好!但是你犯了一个错误。我不得不恢复结果,它是(sp.CurrentStatus &amp; (SpStatus)statuses) == sp.CurrentStatus; 而不是(sp.CurrentStatus &amp; (SpStatus)statuses) == (SpStatus)statuses);。现在看来合乎逻辑了!
    • 啊,是的,很好看。
    【解决方案2】:

    你可以这样声明你的枚举吗?

    [Flags]
        public enum Status
        {
            Filter0 = 0,
            Filter1 = 1,
            Filter2 = 2,
            Filter3 = 3,
            Filter4 = 4,
    
        }
    

    【讨论】:

    • 据我所知,这样我不能将枚举与按位运算结合起来
    【解决方案3】:

    您的枚举名称是Status,为什么要将其转换为SpStatus

    sp.CurrentStatus == (SpStatus)statuses;

    我会这样做:

    CheckBox[] boxes = new CheckBox[] {Filter1CB, Filter2CB, Filter3CB, Filter4CB}
    int stat = 0, pow = 1;
    foreach(CheckBox c in boxes)
    {   
        if(c.IsChecked)  stat += pow;
        pow *= 2;
    }    
    Filter = (Status)stat;
    

    【讨论】:

    • 抱歉打错了,已更正。枚举是 SpStatus。
    • Filter{i}CB 符号不是我的真实代码,它是用于示例的。在我的 cro 中,每个过滤器都有不同的名称。
    • 写同样的代码比我的更快。并得到同样的错误,现在尝试。
    • 不是错误,但过滤器只适用于一个复选框,而不适用于两个(列表为空)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多