我的应用程序中有一个datagrid和一个组合框。我必须过滤datagrid
所选项combobox
,我尝试在我的应用中实现CollectionViewSource.Filter
事件,但是我收到此错误。
我做了什么:
代码隐藏:
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>
输出窗口如下所示:
答案 0 :(得分:2)
ObjectSet<T>派生自ObjectQuery,它实现了WPF用于生成可绑定集合的IListSource。由于您正在指定一个接口,而不是一个实现,因为您的可绑定集合WPF正在生成(或可能正在转换?)您的集合到BindingListCollectionView。您的CollectionViewSource将过滤委托给它的基础集合ObjectSet(它被解释为BindingListCollectionView)doesn't support filtering。
我相信解决方案是将db.Query集合包装在支持过滤的东西中 - 可能是List&lt; T&gt;或ObservableCollection&lt; T&gt;。也许是这样的:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.Query = new ObservableCollection<LogEntry>(db.LogEntries);
this.logViewSource=(CollectionViewSource)(FindResource("logEntriesViewSource"));
logViewSource.Source = this.Query;
}
答案 1 :(得分:1)
这是我试过的代码:
CollectionViewSource logViewSource;
IEnumerable<object> Query;
IEnumerable<string> objects= new List<string> { "a", "b" };
Query = objects;
logViewSource=(CollectionViewSource)(FindResource("logEntriesViewSource"));
logViewSource.Source = Query;