2013-04-04 24 views
1

我的应用程序中有一个datagrid和一个组合框。我必须过滤combobox所选项目上的datagrid,我试图在我的应用中实施CollectionViewSource.Filter事件,但我得到此错误。'System.Windows.Data.BindingListCollectionView'视图不支持筛选

'System.Windows.Data.BindingListCollectionView' view does not support filtering

我做了什么:

代码隐藏:

private CollectionViewSource logViewSource; 
    IEnumerable<LogEntry> Query; 
    DB_Entities db = new DB_Entities(); 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.Query = db.LogEntries; 
     this.logViewSource=(CollectionViewSource)(FindResource("logEntriesViewSource")); 
     logViewSource.Source = this.Query; 
    } 

    private void CollectionViewSource_Filter(object sender, FilterEventArgs e) 
    { 
     LogEntry log = e.Item as LogEntry; 
     ComboBoxItem cbi = (ComboBoxItem)comboBox1.SelectedItem; 

     if (cbi != null) 
     { 
      string s = cbi.Content.ToString(); 
      if (log.Type == s) 
      { 
       e.Accepted = true; 
      } 
      else 
      { 
       e.Accepted = false; 
      } 
     } 

    } 

    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     CollectionViewSource cvs = FindResource("logEntriesViewSource") as CollectionViewSource; 
     cvs.View.Refresh(); 
    } 

XAML:

<Window.Resources> 
    <CollectionViewSource x:Key="logEntriesViewSource" d:DesignSource="{d:DesignInstance my:LogEntry, CreateList=True}" Filter="CollectionViewSource_Filter" /> 
</Window.Resources> 

<Grid DataContext="{StaticResource logEntriesViewSource}"> 

    <ComboBox Height="29" HorizontalAlignment="Left" SelectionChanged="comboBox1_SelectionChanged" 
       Name="comboBox1" VerticalAlignment="Top" Width="115" Margin="388,2,0,0"> 
     <ComboBoxItem Content="Warning"/> 
     <ComboBoxItem Content="Error"/> 
     <ComboBoxItem Content="Exception"/>    
    </ComboBox> 

    <DataGrid AutoGenerateColumns="False" 
       EnableRowVirtualization="True" Height="274" HorizontalAlignment="Left" ItemsSource="{Binding}" 
       Name="logEntriesDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="503" Margin="0,37,0,0"> 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="iDColumn" Binding="{Binding Path=ID}" Header="ID" Width="auto" /> 
      <DataGridTextColumn x:Name="fileNameColumn" Binding="{Binding Path=FileName}" Header="File Name" Width="auto" /> 
      <DataGridTextColumn x:Name="typeColumn" Binding="{Binding Path=Type}" Header="Type" Width="auto" /> 
      <DataGridTextColumn x:Name="criticalColumn" Binding="{Binding Path=Critical}" Header="Critical" Width="auto" /> 
     </DataGrid.Columns> 
    </DataGrid>  
</Grid> 

输出窗口看起来像这样:

Output

+0

这段代码适用于我,除了我用'新列表()'替换'db.LogEntries'。 db.LogEntries返回什么? – 2013-04-04 13:32:24

+0

它是对象 - “公共对象集 LogEntries”。 LogEntry是我的表是我的数据库,它被映射为实体框架中的模型 – user1221765 2013-04-04 13:36:09

+0

也为我工作 – user1064519 2013-04-04 13:43:07

回答

2

ObjectSet<T>从派生的ObjectQuery它实现IListSource其中WPF使用,以产生可绑定集合。既然你指定了一个接口,而不是一个实现,因为你的可绑定集合WPF正在生成(或者可能将其转换为?)你的集合到一个BindingListCollectionView。您的CollectionViewSource将过滤委托给它的底层集合ObjectSet(它被解释为BindingListCollectionView),其中doesn't support filtering

我认为,解决办法是换你db.Query收藏的东西,不支持过滤 - 也许列表<牛逼>或一个ObservableCollection <牛逼>。也许是这样的:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.Query = new ObservableCollection<LogEntry>(db.LogEntries); 
    this.logViewSource=(CollectionViewSource)(FindResource("logEntriesViewSource")); 
    logViewSource.Source = this.Query; 
} 
+0

的确如此。你救了我从这个问题.. – user1221765 2013-04-05 09:02:37

+0

感谢解决我的问题;) – 2017-04-26 07:32:59

1

这是我试图的代码:

CollectionViewSource logViewSource; 
    IEnumerable<object> Query; 
    IEnumerable<string> objects= new List<string> { "a", "b" }; 
    Query = objects; 
    logViewSource=(CollectionViewSource)(FindResource("logEntriesViewSource")); 
    logViewSource.Source = Query; 
+0

我从数据库中获取datagrid的数据,通过db.LogEntries,db是实体的对象,而LogEntries是Object Set – user1221765 2013-04-04 14:56:48