DRD94 Ответов: 1

Фильтрация Collectionview по флажкам и тексту текстового поля


Я рассматриваю фильтрацию CollectionView, основанную, во-первых, на некотором тексте внутри текстового поля и, во-вторых, на том, установлены ли определенные флажки или нет. Чего я действительно хочу избежать, так это иметь сверхдлинный метод фильтрации, который говорит что-то вроде,
If CheckBox1 is checked
{
    If CompanyContains SearchBox.Text && CompanyMeetsCheckBox1Spec
}
If CheckBox2 is checked
{
    If CompanyContains SearchBox.Text && CompanyMeetsCheckBox2Spec
}


и так далее, и так далее для любого количества флажков, которые я могу в конечном итоге получить. Возможно, у меня даже есть несколько флажков, так что это может закончиться;

If CheckBox1 is checked && CheckBox2 is checked
{
    If CompanyContains SearchBox.Text && CompanyMeetsCheckBox1Spec &&                 CompanyMeetsCheckBox2Spec 
}


Это действительно может затянуться надолго. Могу ли я попросить вас дать мне какое-нибудь предложение о том, как "аккуратно" избежать невероятно длинного метода фильтрации?.. Надеюсь, я правильно объяснил.

Что я уже пробовал:

Это метод, который я использую до сих пор для фильтрации на основе текста SearchBox;

private void SearchBoxCallApplyFilters(object sender, TextChangedEventArgs e)
{
    CollectionViewSource.GetDefaultView(Companies).Refresh();
}

private bool FilterCompanies(object obj)
{
    Var company = obj as CompanyModel;
    if (searchBox.Text == string.Empty)
    {
        return true;
    }
    else if (company.Name.ToLower().Contains(CharactersOnly(searchBox.Text.ToLower())))
    {
        return true;
    }
    return false;
}

Ralf Meier

Для меня ваше требование совершенно непонятно-извините ...
Пожалуйста, объясните на примере, чего вы пытаетесь достичь.

Конечно, можно получить результаты с помощью цикла. Для этого необходимо, чтобы соответствующие элементы управления имели соответствующие имена. У вас он такой ?

1 Ответов

Рейтинг:
4

Henrik Jonsson

При условии, что все условия флажка должны быть заполнены полностью ("ANDed" вместе), вы, по крайней мере, можете свести проблему к одному оператору if для каждого флажка и избежать повторения проверки текста следующим образом:

private bool FilterCompanies(object obj)
{
    Var company = obj as CompanyModel;
    if (searchBox.Text == string.Empty)
    {
        return true;
    }
    else if (company.Name.ToLower().Contains(CharactersOnly(searchBox.Text.ToLower())))
    {
        if( chkBox1.IsChecked && MeetsCheckBox1Spec(Company) == false )
        {
           return false;
        }
        if( chkBox2.IsChecked && MeetsCheckBox2Spec(Company) == false )
        {
           return false;
        }
        ...

        return true;
    }
    return false;
}


Если у вас есть больше флажков, которые могут быть обработаны таким образом, или более сложная логика между ними, вам, возможно, придется подумать о том, является ли ваше решение удобным для пользователя вообще.