Я пытаюсь сделать фильтр 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
никогда не вызывается.
Что я делаю не так?