2016-12-23 16 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回だけ観測可能なコレクションをロードしてからフィルタを実行します –

答えて

1

それを濾過しますICollectionViewに、ではないのObservableCollectionです。

ですから、ICollectionViewのプロパティにバインドする必要があります。

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

...またはこのいずれかでフィルタの項目を探します。

var filtered = VM.CommonData.DataFilters.UserMappedRolesView; 

また、あなたはいつでもCollectionViewをリフレッシュする必要がありますつまり、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

こんにちは、ありがとう、包括的な答えです –

関連する問題