Ошибка результатов повторяющегося фильтра SL4 AutoCompleteBox - PullRequest
5 голосов
/ 28 февраля 2011

У меня проблема с фильтрацией AutoCompleteBox.

Кажется, он запоминает предыдущий фильтр.

Например, я набираю 'A', и он возвращает 1 элемент. Я удаляю 'A' и набираю 'Z', который должен вернуть 1 элемент.

Проблема в том, что он возвращает результаты из фильтра 'A' плюс 'Z', я удаляю 'Z' и набираю 'S', который возвращает 2 элемента, и теперь он отображает результаты всех 3 фильтров.

Я что-то не так делаю?

stockTypes.Add(new StockTypeDTO() { Description = "Steel Coil", StockCode = "SC" });
stockTypes.Add(new StockTypeDTO() { Description = "Palletised Steel Coil", StockCode = "PS" });
stockTypes.Add(new StockTypeDTO() { Description = "ZZZZZ", StockCode = "ZZ" });


<input:AutoCompleteBox x:Name="testauto" FilterMode="Custom">
    <input:AutoCompleteBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <ContentPresenter Content="{Binding Description}" />
            </StackPanel>
        </DataTemplate>
    </input:AutoCompleteBox.ItemTemplate>
</input:AutoCompleteBox>

testauto.ItemsSource = this.StockTypes;

testauto.ItemFilter = (search, item) =>
{
    StockTypeDTO stockType = item as StockTypeDTO;

    if (stockType != null)
    {
        string filter = search.ToUpper(CultureInfo.InvariantCulture);
        return (stockType.StockCode.ToUpper(CultureInfo.InvariantCulture).Contains(filter)
        || stockType.Description.ToUpper(CultureInfo.InvariantCulture).Contains(filter));
    }

    return false;
};

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

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

1 голос
/ 07 апреля 2011

Я закончил тем, что унаследовал AutoCompleteBox, захватив событие Populated и выполнив этот взлом.

var listBox = this.GetTemplateChild("Selector") as ListBox; 
var items = listBox.ItemsSource; 
listBox.ItemsSource = null; 
listBox.ItemsSource = items;

Это решило проблему, я уверен, что есть более чистый способ сделать это, но у меня не было времени возиться с этим.

...