xaml中的ComboBox数据过滤

时间:2013-06-05 08:55:07

标签: c# wpf xaml .net-4.5

我使用的是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”的项目。

我已经知道我可以使用数据触发器执行此操作,因为我过去曾使用过它们来根据内容设置文本颜色,但我不确定是否可以按照我需要的方式进行过滤。

1 个答案:

答案 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;
        }
    }