J'essaie de faire un ComboBox
filtrer son ItemsSource
sur la base d'un FilterValue
liée à son Text
; le contrôle se trouve à l'intérieur du CellEditingTemplate
d'un DataGrid
qui est lui-même à l'intérieur d'un DataTemplate
. Les éléments mettent tous en œuvre un ICodeName
qui garantit qu'il y a une Code
et un Name
et j'utilise avec succès une propriété ItemTemplate
qui en tire parti.
Ainsi, le contexte d'une DataGridRow
est un Foo
une classe de modèle de vue qui implémente INotifyPropertyChanged
et expose un Bars
qui est une ICollectionView
("SuggestionBox" est un contrôle d'utilisateur héritant de 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>
La classe d'éléments de la rangée de grille ( Foo
) les expose :
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();
}
}
}
Quand j'exécute le programme, je peux voir la Bars
dans la liste déroulante ; lorsque je tape dans la "boîte à idées", un point d'arrêt défini dans la fenêtre de l'outil d'évaluation de la sécurité est activé. FilterValue
le passeur est touché - cependant FilterBars
n'est jamais invoquée.
Qu'est-ce que je fais de mal ?