Фильтрация WPF ICollectionView

Я написал код для фильтрации элементов в ComboBox:

Мой вопрос в том, как бы вы это сделали?

Я думаю, что это решение с отражением может быть очень медленным..

ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
view.Filter += this.FilterPredicate;


private bool FilterPredicate(object value)
{            
    if (value == null)
        return false;

    if (String.IsNullOrEmpty(SearchedText))
        return true;            

    int index = value.ToString().IndexOf(
        SearchedText,
        0,
        StringComparison.InvariantCultureIgnoreCase);

    if ( index > -1) return true;

    return FindInProperties(new string[] { "Property1", "Property2" }, value, SearchedText);
}

private bool FindInProperties(string[] properties, object value, string txtToFind)
{
    PropertyInfo info = null;
    for (int i = 0; i < properties.Length; i++)
    {
        info = value.GetType().GetProperty(properties[i]);
        if (info == null) continue;

        object s  = info.GetValue(value, null);
        if (s == null) continue;

        int index = s.ToString().IndexOf(
            txtToFind,
            0,
            StringComparison.InvariantCultureIgnoreCase);

        if (index > -1) return true;
    }
    return false;
}

person PaN1C_Showt1Me    schedule 26.01.2010    source источник


Ответы (1)


Почему бы не только это:

ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
IEqualityComparer<String> comparer = StringComparer.InvariantCultureIgnoreCase;
view.Filter = o => { 
                     Person p = o as Person; 
                     return p.FirstName.Contains(SearchedText, comparer) 
                            || p.LastName.Contains(SearchedText, comparer); 
                   }

Вам нужен динамический поиск недвижимости?

person codekaizen    schedule 26.01.2010
comment
Я не знаю, каким будет основной ItemSource. Он должен работать для каждого объекта - person PaN1C_Showt1Me; 26.01.2010
comment
Пользователю этого элемента управления должна быть предоставлена ​​возможность выбора способа поиска. - person PaN1C_Showt1Me; 26.01.2010
comment
Ну, тогда да, размышление — это единственный способ добиться этого. Я думаю, что вы, вероятно, будете в порядке с точки зрения производительности, если только вы не имеете дело с десятками или сотнями тысяч объектов. Вы можете реализовать IReflect для типа, который вы ищете, и это может ускорить процесс, если ваша измеренная производительность не соответствует потребностям пользователя. - person codekaizen; 26.01.2010