将 IsChecked 绑定到位字段

问题描述 投票:0回答:1

我有一个像这样的位字段:

[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);

我现在的问题是我无法从转换器获得正确的返回值,因为那里不知道所有标志的当前状态,而且我也无法设法将所有标志的当前状态获取到转换器中。

我可以激活一个标志,但无法在不停用或激活其他标志的情况下停用任何标志,这将是意外行为。

c# wpf data-binding bit-manipulation ivalueconverter
1个回答
0
投票

好像我用这个得到了它:

转换器:

if ((bool)value)
    return (EmployeeType)parameter;
else
    return ~(EmployeeType)parameter;

二传手:

if ((int)value > 0)
    _employeeType |= value;
else
    _employeeType &= value;

不能 100% 确定这是否是一个只适用于我的场景的 hack,但是,它确实有效:D

© www.soinside.com 2019 - 2024. All rights reserved.