我有一个像这样的位字段:
[Flags]
public enum EmployeeType
{
None = 0,
IsInOffice = 1,
IsManager = 2,
IsOnVacation = 4,
...
}
我的用户界面有一个所有员工的列表框,我想实现复选框来过滤列表。该列表框绑定到过滤器属性,如下所示:
public IEnumerable<Employee> FilteredEmployees
=> _employees.Where(e => _regexFilter.IsMatch(e.FullName)
&& (!EmployeeType.HasFlag(EmployeeType.IsInOffice) || e.IsLoggedIn)
&& (!EmployeeType.HasFlag(EmployeeType.IsManager) || e.RoleID >= 4)
&& (!EmployeeType.HasFlag(EmployeeType.IsOnVacation) || TimeRec.GetStatusID(e.ID) == 7))
.OrderBy(e => e.FullName);
我现在的问题是我无法从转换器获得正确的返回值,因为那里不知道所有标志的当前状态,而且我也无法设法将所有标志的当前状态获取到转换器中。
我可以激活一个标志,但无法在不停用或激活其他标志的情况下停用任何标志,这将是意外行为。
好像我用这个得到了它:
转换器:
if ((bool)value)
return (EmployeeType)parameter;
else
return ~(EmployeeType)parameter;
二传手:
if ((int)value > 0)
_employeeType |= value;
else
_employeeType &= value;
不能 100% 确定这是否是一个只适用于我的场景的 hack,但是,它确实有效:D