我正在尝试使用复选框过滤器过滤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,
}
答案 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;