私は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'に設定することで、レコードを返さないと思っています。
私はどこにでもブレークポイントを設定しており、コードの永遠に「ヒット」します。
私は(間違いなく)これを間違って実装しましたか?
おかげ
ではないのですが、それは本当にあなたがクリアして、更新が、それを置き換えることはできません読み取り専用のコレクションとして定義されなければなりません。 Wpfはリストが削除されたときの変更を処理しません(バインドされている可能性のある他のNotifyPropertyChangedイベントについても考えています) – Icepickle
@Icepickleこんにちは、ありがとうございます。しかし、それは私のコードがしていることです。 1回だけ観測可能なコレクションをロードしてからフィルタを実行します –