我使用的是Telerik组合框,但我认为这个问题与标准的wpf组合框有关。该控件绑定到一个可观察的“TableRecord”集合,其中此对象如下所示:
public enum RecordState
{
Orginal, Added, Modified, Deleted
}
public class TableRecord<T>
{
public Guid Id { get; set; }
public string DisplayName { get; set; }
public T Record { get; set; }
public RecordState State { get; set; }
public TableRecord(Guid id, string displayName, T record, RecordState state)
{
Id = id;
DisplayName = displayName;
Record = record;
State = state;
}
}
这些“TableRecords”如下所示:
private ObservableCollection<TableRecord<T>> _recordCollection = new ObservableCollection<TableRecord<T>>();
public ObservableCollection<TableRecord<T>> Commands
{
get
{
return _recordCollection;
}
}
我的xaml看起来像这样:
<telerik:RadComboBox ItemsSource="{Binding Commands}" DisplayMemberPath="DisplayName" SelectedValuePath="Id" Height="22" SelectedItem="{Binding SelectedCommand, Mode=TwoWay}" />
我想要做的是更改xaml(如果可能),以便它显示集合中的所有项目,而不是“State”值设置为“Deleted”的项目。
我已经知道我可以使用数据触发器执行此操作,因为我过去曾使用过它们来根据内容设置文本颜色,但我不确定是否可以按照我需要的方式进行过滤。
答案 0 :(得分:2)
最佳方法是使用CollectionViewSource进行过滤。在资源中定义集合视图源并对其进行修改。
<Window.Resources>
<CollectionViewSource Source="{Binding Commands}" x:Key="source"/>
</Window.Resources>
<Grid>
<ComboBox VerticalAlignment="Center" HorizontalAlignment="Center" Width="200"
ItemsSource="{Binding Source={StaticResource source}}"
DisplayMemberPath="DisplayName"/>
</Grid>
在代码隐藏中,为集合视图源设置Filter回调,
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var source = this.Resources["source"] as CollectionViewSource;
source.Filter += source_Filter;
}
private void source_Filter(object sender, FilterEventArgs e)
{
if (((TableRecord) e.Item).State == RecordState.Deleted)
{
e.Accepted = false;
}
else
{
e.Accepted = true;
}
}