Sửa bộ lọc tìm kiếm C # WPF

Oct 29 2020

Tôi đang cố gắng thực hiện bộ lọc tìm kiếm trên chương trình của mình. Tôi đã xem bài đăng này để hiểu cách bắt đầu ( Lọc ICollectionView được liên kết với ItemsControl ), nhưng tôi có một số lỗi mà tôi không thể sửa.

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; }

Các lỗi:

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

    Đối số 1: không thể chuyển đổi từ 'nhóm phương thức' thành 'System.Action'

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

    Không thể tìm thấy loại hoặc tên không gian tên '_ncReasearch' (bạn đang thiếu chỉ thị using hoặc tham chiếu hợp ngữ) * * Lỗi cụm từ biểu thức không hợp lệ 'đối tượng'

Trả lời

1 thatguy Oct 29 2020 at 18:43

Đối số 1: không thể chuyển đổi từ 'nhóm phương thức' thành 'System.Action'

Các RelayCommanddự đoán một chữ ký phương pháp như thế này.

void _Search(object obj)

_SearchPhương pháp của bạn không phù hợp. Bạn có thể giới thiệu một lambda để truyền object:

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

Hoặc bạn có thể thay đổi chữ ký của _Searchphương thức và ép kiểu đối tượng trong đó, nhưng tôi đoán bạn cần phương thức này để trả về a boolcho bộ lọc, vì vậy bạn không thể làm điều này.

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

Tuy nhiên, câu hỏi chính ở đây là tại sao bạn lại tạo một lệnh cho việc này ngay từ đầu. Lệnh không trả về bất kỳ thứ gì và _Searchphương thức của bạn là một vị từ, vì vậy nó không thay đổi bất kỳ trạng thái nào. Việc gọi lệnh không làm được gì ngoại trừ lãng phí thời gian của CPU.

Không thể tìm thấy loại hoặc tên không gian tên '_ncReasearch' (bạn đang thiếu chỉ thị sử dụng hoặc tham chiếu hợp ngữ) Lỗi cụm từ biểu thức không hợp lệ 'đối tượng'

Bạn đang tạo Predicate<object>sai. Một vị từ của kiểu đó nhận một objectthể hiện làm tham số và trả về boolkết quả của việc kiểm tra nó. Ở phía bên trái của astoán tử cần phải là một thể hiện và ở phía bên phải là kiểu truyền tới, tại đây JobParameter.

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

Bạn thậm chí có thể truyền objthích trực tiếp (JobDocument) objvà chỉ định Filtertrực tiếp.

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

Đọc thêm về astoán tử trong tài liệu: với tư cách là toán tử