WPF多个CollectionView与同一个集合上的不同filter

我正在使用一个ObservableCollection与两个ICollectionView不同的filter。

一个是按某种types过滤邮件,一个是用于计算检查的邮件。 正如你所看到的消息filter和消息计数工作正常,但是当我不检查消息从列表中消失( 计数仍在工作 )。

顺便说一句,很抱歉,我想包括所有相关的东西。

XAML代码:

 <!-- Messages List --> <DockPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Height="500"> <ListBox Name="listBoxZone" ItemsSource="{Binding filteredMessageList}" Background="Transparent" BorderThickness="0"> <ListBox.ItemTemplate> <DataTemplate> <CheckBox Name="CheckBoxZone" Content="{Binding text}" Tag="{Binding id}" Unchecked="CheckBoxZone_Unchecked" Foreground="WhiteSmoke" Margin="0,5,0,0" IsChecked="{Binding isChecked}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </DockPanel> <Button Content="Test Add New" Grid.Column="2" Height="25" HorizontalAlignment="Left" Margin="34,2,0,0" Click="button1_Click" /> <Label Content="{Binding checkedMessageList.Count}" Grid.Column="2" Height="25" Margin="147,2,373,0" Width="20" Foreground="white" /> 

截图: 在这里输入图像说明

码:

 /* ViewModel Class */ public class MainViewModel : INotifyPropertyChanged { // Constructor public MainViewModel() { #region filteredMessageList // connect the ObservableCollection to CollectionView _filteredMessageList = CollectionViewSource.GetDefaultView(messageList); // set filter _filteredMessageList.Filter = delegate(object item) { MessageClass temp = item as MessageClass; if ( selectedFilter.Equals(AvailableFilters.All) ) { return true; } else { return temp.filter.Equals(_selectedFilter); } }; #endregion #region checkedMessageList // connect the ObservableCollection to CollectionView _checkedMessageList = CollectionViewSource.GetDefaultView(messageList); // set filter _checkedMessageList.Filter = delegate(object item) { return (item as MessageClass).isChecked; }; #endregion } // message List private ObservableCollection<MessageClass> _messageList = new ObservableCollection<MessageClass>(); public ObservableCollection<MessageClass> messageList { get { return _messageList; } set { _messageList = value; } } // CollectionView (filtered messageList) private ICollectionView _filteredMessageList; public ICollectionView filteredMessageList { get { return _filteredMessageList; } } // CollectionView (filtered messageList) private ICollectionView _checkedMessageList; public ICollectionView checkedMessageList { get { return _checkedMessageList; } } // SelectedFilter property private AvailableFilters _selectedFilter = AvailableFilters.All; // Default is set to all public AvailableFilters selectedFilter { get { return _selectedFilter; } set { _selectedFilter = value; RaisePropertyChanged("selectedFilter"); _filteredMessageList.Refresh(); // refresh list upon update } } // FilterList (Convert Enum To Collection) private List<KeyValuePair<string, AvailableFilters>> _AvailableFiltersList; public List<KeyValuePair<string, AvailableFilters>> AvailableFiltersList { get { /* Check if such list available, if not create for first use */ if (_AvailableFiltersList == null) { _AvailableFiltersList = new List<KeyValuePair<string, AvailableFilters>>(); foreach (AvailableFilters filter in Enum.GetValues(typeof(AvailableFilters))) { string Description; FieldInfo fieldInfo = filter.GetType().GetField(filter.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); /* if not null get description */ if (attributes != null && attributes.Length > 0) { Description = attributes[0].Description; } else { Description = string.Empty; } /* add as new item to filterList */ KeyValuePair<string, AvailableFilters> TypeKeyValue = new KeyValuePair<string, AvailableFilters>(Description, filter); _AvailableFiltersList.Add(TypeKeyValue); } } return _AvailableFiltersList; } } #region Implement INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } #endregion } 

代码用于取消检查function

 private void CheckBoxZone_Unchecked(object sender, RoutedEventArgs e) { CheckBox chkZone = (CheckBox)sender; ucSystemMessageVM.checkedMessageList.Refresh(); } 

这个答案帮助我确切的问题。 静态的CollectionViewSource.GetDefaultView(coll)方法将始终返回给定集合的同一个引用,所以基于同一个引用的多个集合视图将适得其反。 通过实例化视图如下:

 ICollectionView filteredView = new CollectionViewSource { Source=messageList }.View; 

该视图现在可以独立于其他任何人进行过滤/sorting/分组。 然后你可以申请你的过滤。

我知道这已经过了几个月了,现在你可能已经解决了你的问题,但是当我遇到同样的问题时,我碰到了这个问题,所以我想我会添加一个答案。