Исправить фильтр поиска C # WPF

Oct 29 2020

Я пытаюсь выполнить поисковый фильтр в своей программе. Я уже видел этот пост, чтобы понять, как начать ( Фильтрация ICollectionView, привязанная к ItemsControl ), но у меня есть некоторые ошибки, которые я не могу исправить.

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

Ошибки:

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

    Аргумент 1: невозможно преобразовать из 'группы методов' в 'System.Action'

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

    Не удалось найти тип или имя пространства имен '_ncReasearch' (отсутствует директива using или ссылка на сборку) * * Ошибка недопустимого выражения термин 'объект'

Ответы

1 thatguy Oct 29 2020 at 18:43

Аргумент 1: невозможно преобразовать из 'группы методов' в 'System.Action'

RelayCommandОжидает сигнатуру метода , как это.

void _Search(object obj)

Ваш _Searchметод не подходит. Вы можете ввести лямбду для преобразования object:

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

Или вы можете изменить подпись _Searchметода и добавить в него объект, но я думаю, вам нужен этот метод, чтобы вернуть a boolдля фильтра, поэтому вы не можете этого сделать.

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

Однако главный вопрос здесь в том, зачем вы вообще создаете команду для этого. Команда ничего не возвращает, а ваш _Searchметод является предикатом, поэтому он не меняет никакого состояния. Вызов команды ничего не делает, кроме потери процессорного времени.

Не удалось найти тип или имя пространства имен '_ncReasearch' (отсутствует директива using или ссылка на сборку) Ошибка недопустимого выражения термин 'объект'

Вы создаете Predicate<object>неправильное. Предикат этого типа получает objectэкземпляр как параметр и возвращает boolв результате своей проверки. Слева от asоператора должен быть экземпляр, а с правой стороны - тип для приведения, здесь JobParameter.

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

Вы даже можете objнапрямую использовать лайк (JobDocument) objи Filterнапрямую назначить его .

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

Подробнее об asоператоре читайте в документации: как оператор