Исправить фильтр поиска C # WPF
Я пытаюсь выполнить поисковый фильтр в своей программе. Я уже видел этот пост, чтобы понять, как начать ( Фильтрация 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; }
Ошибки:
public RelayCommand Search => _search ??= new RelayCommand(_Search);Аргумент 1: невозможно преобразовать из 'группы методов' в 'System.Action'
NcView.Filter = new Predicate<object>(object,_Search(object as _ncResearch));Не удалось найти тип или имя пространства имен '_ncReasearch' (отсутствует директива using или ссылка на сборку) * * Ошибка недопустимого выражения термин 'объект'
Ответы
Аргумент 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операторе читайте в документации: как оператор