2016-12-23 17 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을 포함 알고 '로그인 필터 이름을'David '로 설정하면 레코드를 반환하지 않을 것으로 예상됩니다.

나는 모든 곳에서 중단 점을 설정했으며 코드의 영원한 편이 '치다'.

내가 잘못 (분명히) 구현 했습니까?

감사

+0

아니다, 그것은 정말 당신이 취소 및 업데이트, 그러나 그것을 대체 할 수있는 읽기 전용 컬렉션으로 정의되어야한다. Wpf는 목록이 제거 될 때 변경 사항을 처리하지 않습니다 (바인딩 될 수있는 가능한 다른 NotifyPropertyChanged 이벤트에 대해서도 생각하십시오). – Icepickle

+0

@Icepickle 안녕하세요, 귀하의 의견을 보내 주셔서 감사합니다. 하지만 그것이 내 코드가하는 것입니다. 모든 것을 관찰 할 수있는 컬렉션을로드 한 다음 필터를 수행합니다. –

답변

1

그것은 필터링됩니다 ICollectionView에 아닌 ObservableCollection에 있습니다.

그래서 당신은 ICollectionView에 속성에 바인딩해야합니다

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

을 ... 나에 필터링 된 항목을 찾아이 하나 : 당신은 또한 당신이 원하는 때마다 CollectionView를 새로 고침 할 필요가

var filtered = VM.CommonData.DataFilters.UserMappedRolesView; 

즉, Login 속성이 새 값으로 설정 될 때마다 필터를 다시 적용하십시오. 이런 식으로 뭔가 : 그것은 ObservableCollection에 변경하는 아주 좋은 방법이

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

안녕하세요, 종합적인 답변을 주셔서 대단히 감사합니다. –