我正试图根据绑定到其ComboBox
的{{1}}字符串,使ItemsSource
对其FilterValue
进行过滤;控件位于Text
的{{1}}内部,而后者本身位于CellEditingTemplate
内部。这些项目都实现了一个DataGrid
接口,该接口保证有一个DataTemplate
和一个ICodeName
属性,而我正在成功地使用一个利用它们的Code
。
因此Name
的上下文是ItemTemplate
,这是一个实现DataGridRow
并公开Foo
属性(即{{1} }(“ SuggestionBox”是继承INotifyPropertyChanged
的用户控件):
Bars
网格行项目类(ICollectionView
)公开以下内容:
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();
}
}
}
。
我在做什么错了?
答案 0 :(得分:2)
当我尝试类似的操作时,实际上使用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
。