2016-12-23 3 views
0

У меня есть приложение для рабочего стола WPF.Почему мой ObservableCollection не фильтр

Загружаю ObservableCollection список объектов.

Я использую объект ICollectionView для обертывания фильтра вокруг этого ObservableCollection.

Я установил фильтр и обновить, но он Nto работает так:

public class DataFilters : ViewModelBase 
{ 
    private ICollectionView _UserMappedRolesView { get; set; } 

    private ObservableCollection<UserMappedRoles> _UserMappedRoles; 
    public ObservableCollection<UserMappedRoles> UserMappedRoles 
    { 
     get 
     { 
      _UserMappedRolesView = CollectionViewSource.GetDefaultView(_UserMappedRoles); 
      _UserMappedRolesView.Filter = UserMappedRolesFilter; 
      _UserMappedRolesView.Refresh(); 
      return _UserMappedRoles; 
     } 
     set 
     { 
      _UserMappedRoles = value; 
     } 
    } 

    public void LoadUserMappedRoles() 
    { 
     var baseData = InformedWorkerBusinessService.UserMappedRoles.Get(); 
     var modelData = 
      from data in baseData 
      select new UserMappedRoles 
      { 
       Enabled = 1, 
       Login = data.Login, 
       UserMappedRolesRef = data.UserMappedRolesRef, 
       UserRoleRef = data.UserRoleRef 

      }; 
     _UserMappedRoles = new ObservableCollection<UserMappedRoles>(modelData); 
    } 
    public string Login { get; set; } 
    private bool UserMappedRolesFilter(object item) 
    { 
     UserMappedRoles UserMappedRole = item as UserMappedRoles; 

     if (UserMappedRole.Login== Login) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

и мой тестовый скрипт:

UI.InformedWorkerViewModel.Models.HeartBeat VM = new UI.InformedWorkerViewModel.Models.HeartBeat(); 
VM.CommonData.DataFilters = new UI.InformedWorkerViewModel.Models.DataFilters(); 
VM.CommonData.DataFilters.LoadUserMappedRoles(); 
var data = VM.CommonData.DataFilters.UserMappedRoles; 
VM.CommonData.DataFilters.Login = "David"; 
var filtered = VM.CommonData.DataFilters.UserMappedRoles; 

Я знаю, что мои данные содержат только oUserMappedRoles где имя Логин является «Энди «поэтому, установив имя фильтра входа в« Давид », я ожидаю, что никаких записей не будет возвращено.

Я установил точки останова всюду, и каждая строка кода получает «удар».

У меня (очевидно) реализовано это неправильно?

Благодаря

+0

Это не очень хорошая практика, чтобы изменить ObservableCollection, это действительно должно быть определено как только для чтения коллекции, вы можете очистить и обновление, но не заменить его. Wpf не обрабатывает изменения так хорошо, когда список удаляется (также подумайте о возможных других событиях NotifyPropertyChanged, которые могут быть привязаны к нему) – Icepickle

+0

@Icepickle Привет, спасибо за ваш комментарий. Но это то, что делает мой код. он загружает наблюдаемую коллекцию всего лишь один раз, а затем я выполняю фильтры на нем –

ответ

1

Это ICollectionView, который фильтруется, а не ObservableCollection.

Таким образом, вы должны привязать к свойству ICollectionView:

<ListBox ItemsSource="{Binding UserMappedRolesView}" DisplayMemberPath="Login" /> 

... или искать отфильтрованные элементы в этом одна:

var filtered = VM.CommonData.DataFilters.UserMappedRolesView; 

Кроме того, необходимо обновить CollectionView всякий раз, когда вы хотите для повторного применения фильтра, т. е. всякий раз, когда ваше свойство Login установлено на новое значение. Что-то вроде этого:

public class DataFilters : ViewModelBase 
{ 
    private ICollectionView _UserMappedRolesView; 
    public ICollectionView UserMappedRolesView 
    { 
     get { return _UserMappedRolesView; } 
     set { _UserMappedRolesView = value; NotifyPropertyChanged(); } 
    } 

    private ObservableCollection<UserMappedRoles> _UserMappedRoles; 
    public ObservableCollection<UserMappedRoles> UserMappedRoles 
    { 
     get 
     { 
      return _UserMappedRoles; 
     } 
     set 
     { 
      _UserMappedRoles = value; 
      NotifyPropertyChanged(); 
      UserMappedRolesView = CollectionViewSource.GetDefaultView(_UserMappedRoles); 
      UserMappedRolesView.Filter = UserMappedRolesFilter; 
      UserMappedRolesView.Refresh(); 
     } 
    } 

    public void LoadUserMappedRoles() 
    { 
     var baseData = InformedWorkerBusinessService.UserMappedRoles.Get(); 
     var modelData = 
      from data in baseData 
      select new UserMappedRoles 
      { 
       Enabled = 1, 
       Login = data.Login, 
       UserMappedRolesRef = data.UserMappedRolesRef, 
       UserRoleRef = data.UserRoleRef 

      }; 
     UserMappedRoles = new ObservableCollection<UserMappedRoles>(modelData); 
    } 


    private string _login; 
    public string Login 
    { 
     get { return _login; } 
     set { _login = value; _UserMappedRolesView.Refresh(); } 
    } 


    private bool UserMappedRolesFilter(object item) 
    { 
     UserMappedRoles UserMappedRole = item as UserMappedRoles; 
     if (UserMappedRole.Login == Login) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
+0

Привет, большое спасибо за ваш всесторонний ответ –

Смежные вопросы