用多个枚举过滤ListView

时间:2018-10-11 21:07:57

标签: c# wpf listview enums

我正在尝试使用复选框过滤器过滤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时状态值为3,依此类推。但是没有应用任何过滤器...
这是我的枚举:

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

    }

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

    }

答案 2 :(得分:0)

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

  

sp.CurrentStatus ==(SpStatus)状态;

我会这样做:

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;