Perbaiki Filter Pencarian C # WPF

Oct 29 2020

Saya mencoba melakukan filter pencarian pada program saya. Saya sudah melihat posting ini untuk memahami cara memulai ( Memfilter ICollectionView terikat ke ItemsControl ), tetapi saya memiliki beberapa kesalahan yang tidak dapat saya perbaiki.

public class SchedulingPageVm : PageViewModel
{
   private readonly NcManager _ncManager;
   private readonly Scheduler _scheduler;
   private String _ncResearch;
   public ICollection<Nc> Ncs => _ncManager.Ncs;

   public string _NcResearch
   {
       get { return _ncResearch; }
       set
       {
           _ncResearch = value;
           OnPropertyChanged("NcList");
       }
   }

   private RelayCommand _search;
   public RelayCommand Search => _search ??= new RelayCommand(_Search);

   public SchedulingPageVm(ICollection<JobDocument> ElencoNc)
   {
       InitializeComponent();
       ElencoNc = (ICollection<JobDocument>)_ncManager.Ncs;

       NcView.Filter = new Predicate<object>(object => _Search(object as _ncResearch));
       this.DataContext = _ncManager.Ncs;
   }

   private bool _Search(JobDocument elencoNc)
   {
       return _ncResearch == null
           || elencoNc.Code.IndexOf(_ncResearch, StringComparison.OrdinalIgnoreCase) != -1
           || elencoNc.FileName.IndexOf(_ncResearch, StringComparison.OrdinalIgnoreCase) != -1
           || elencoNc.FilePath.IndexOf(_ncResearch, StringComparison.OrdinalIgnoreCase) != -1;
   }

   public CollectionView NcView
   {
       get { return (CollectionView)CollectionViewSource.GetDefaultView(_ncManager.Ncs); }
   }

   public ObservableCollection<Nc> DataContext { get; }

Kesalahan:

  1. public RelayCommand Search => _search ??= new RelayCommand(_Search);

    Argumen 1: tidak dapat mengonversi dari 'grup metode' menjadi 'System.Action'

  2. NcView.Filter = new Predicate<object>(object,_Search(object as _ncResearch));

    Jenis atau nama namespace '_ncReasearch' tidak dapat ditemukan (Anda kehilangan petunjuk penggunaan atau referensi perakitan) * * Kesalahan istilah ekspresi tidak valid 'objek'

Jawaban

1 thatguy Oct 29 2020 at 18:43

Argumen 1: tidak dapat mengonversi dari 'grup metode' menjadi 'System.Action'

Mereka RelayCommandmengharapkan tanda tangan metode seperti ini.

void _Search(object obj)

Anda _Searchmetode tidak cocok. Anda bisa memperkenalkan lambda untuk melemparkan object:

public RelayCommand Search => _search ??= new RelayCommand(obj => _Search((JobDocument)obj));

Atau Anda dapat mengubah tanda tangan _Searchmetode dan melemparkan objek di dalamnya, tapi saya rasa Anda memerlukan metode ini untuk mengembalikan boolfilter, jadi Anda tidak dapat melakukan ini.

private bool _Search(object obj)
{
   var elencoNc = (JobDocument) obj;
   // ...other code.
}

Namun, pertanyaan utama di sini adalah mengapa Anda membuat perintah untuk ini sejak awal. Perintah tidak mengembalikan apa pun dan _Searchmetode Anda adalah predikat, jadi tidak mengubah status apa pun. Pemanggilan perintah tidak melakukan apa pun kecuali membuang waktu CPU.

Jenis atau nama namespace '_ncReasearch' tidak dapat ditemukan (Anda kehilangan arahan menggunakan atau referensi perakitan) Kesalahan istilah ekspresi tidak valid 'objek'

Anda membuat Predicate<object>kesalahan. Predikat jenis itu mendapatkan objectinstance sebagai parameter dan mengembalikan boolhasil sebagai hasil pemeriksaannya. Di sisi kiri asoperator perlu ada instance dan di sisi kanan jenis yang akan ditransmisikan, di sini JobParameter.

NcView.Filter = new Predicate<object>(obj => _Search(obj as JobDocument));

Anda bahkan dapat mentransmisikan objsuka secara langsung (JobDocument) objdan menetapkannya Filtersecara langsung.

NcView.Filter = obj => _Search((JobParameter) obj);

Baca lebih lanjut tentang asoperator di dokumentasi: sebagai operator