Фильтрация ComboBox.ItemsSource - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь сделать фильтр ComboBox его ItemsSource на основе строки FilterValue, привязанной к Text;элемент управления находится внутри CellEditingTemplate из DataGrid, который сам находится внутри DataTemplate.Все элементы реализуют интерфейс ICodeName, который гарантирует наличие свойств Code и Name, и я успешно использую ItemTemplate, который их использует.

Итак, контекст DataGridRow является Foo, классом модели представления, который реализует INotifyPropertyChanged и предоставляет свойство Bars, которое является ICollectionView ("SuggestionBox" - это пользовательский элемент управления, наследующий ComboBox):

<DataGridTemplateColumn Header="Bar">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <local:SuggestionBox Text="{Binding FilterValue, UpdateSourceTrigger=PropertyChanged}"
                                 ItemsSource="{Binding Bars, UpdateSourceTrigger=PropertyChanged}"
                                 ItemTemplate="{StaticResource CodeNameDropdownTemplate}">
            </local:SuggestionBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

Класс элементов строки сетки (Foo) предоставляет следующие возможности:

private ICollectionView _bars;
public ICollectionView Bars
{
    get { return _bars; }
    set
    {
        if (_bars != value)
        {
            _bars = value;
            _bars.Filter = FilterBars;
            OnPropertyChanged();
        }
    }
}

private bool FilterBars(object obj)
{
    var item = (ICodeName)obj;
    return string.IsNullOrEmpty(FilterValue) 
        || item.Code.Contains(FilterValue) 
        || item.Name.Contains(FilterValue);
}

private string _filterValue;
public string FilterValue
{
    get
    {
        return _filterValue;
    }
    set
    {
        if (_filterValue != value)
        {
            _filterValue = value;
            OnPropertyChanged();
            Bars.Refresh();
        }
    }
}

Когда я запускаю программу, я вижу Bars, перечисленные в раскрывающемся списке;когда я набираю «поле для предложений», срабатывает точка останова, установленная в установщике FilterValue, однако FilterBars никогда не вызывается.

Что я делаю не так?

1 Ответ

0 голосов
/ 30 января 2019

Когда я попробовал нечто подобное, использование CollectionView фактически выдало мне предупреждение:

System.Windows.Data Warning: 53 : Using CollectionView directly is not fully supported.  The basic features work, although with some inefficiencies, but advanced features may encounter known bugs.  Consider using a derived class to avoid these problems.

Вместо непосредственного создания экземпляра CollectionView, вы можете сделать следующее:

Bars = CollectionViewSource.GetDefaultView(codeNames);

Это создаст экземпляр ListCollectionView, который происходит от CollectionView.Кстати, codeNames - это просто переменная, которую я дал вашему ObservableCollection<ICodeName>.

Наконец, даже если вы обновляете ICollectionView в установщике FilterValue, вам все равно нужно сообщить WPFобновить свой взгляд.Другими словами, вам нужно поднять PropertyChanged на Bars.

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