Фильтр ListView с несколькими перечислениями - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь отфильтровать ListView с помощью фильтров-флажков и применяю эти фильтры к перечислению.Это работает для одного фильтра, но не для комбинации.Перечисление имеет все значения power, равные двум, и атрибут [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;
            };

Я проверил, значение статусов равно 3, когда проверены фильтры 1 и 2, и так далее.Но он не применяет никаких фильтров ...
Вот мое перечисление:

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

    }

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Ваше имя enum 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;
0 голосов
/ 12 октября 2018

Ваш фильтр должен проверить, соответствует ли входящий элемент всем указанным флагам.Таким образом, логическое И используется для извлечения флагов фильтрации.Затем сравнение с флагами фильтров гарантирует, что нас интересуют только те элементы, у которых установлены все флаги.

Sp.Filter = item =>
{
    Sp sp = (Sp)item;
    return (sp.CurrentStatus & (SpStatus)statuses) == (SpStatus)statuses;
};
0 голосов
/ 12 октября 2018

Можно ли объявить свой enum следующим образом?

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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...