Suchfilter C # WPF korrigieren
Ich versuche, einen Suchfilter für mein Programm durchzuführen. Ich habe diesen Beitrag bereits gesehen, um zu verstehen, wie man startet ( Filtern von ICollectionView an ItemsControl gebunden ), aber ich habe einige Fehler, die ich nicht beheben kann.
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; }
Fehler:
public RelayCommand Search => _search ??= new RelayCommand(_Search);Argument 1: Konvertierung von 'Methodengruppe' in 'System.Action' nicht möglich
NcView.Filter = new Predicate<object>(object,_Search(object as _ncResearch));Der Typ- oder Namespace-Name '_ncReasearch' wurde nicht gefunden (Ihnen fehlt eine using-Direktive oder eine Assembly-Referenz). * * Fehler ungültiger Ausdrucksbegriff 'object'
Antworten
Argument 1: Konvertierung von 'Methodengruppe' in 'System.Action' nicht möglich
Das RelayCommanderwartet eine Methodensignatur wie diese.
void _Search(object obj)
Ihre _SearchMethode stimmt nicht überein. Sie können entweder ein Lambda einführen, um Folgendes zu wirken object:
public RelayCommand Search => _search ??= new RelayCommand(obj => _Search((JobDocument)obj));
Sie können auch die Signatur der _SearchMethode ändern und das Objekt darin umwandeln, aber ich denke, Sie benötigen diese Methode, um ein boolfür den Filter zurückzugeben, sodass Sie dies nicht tun können.
private bool _Search(object obj)
{
var elencoNc = (JobDocument) obj;
// ...other code.
}
Die Hauptfrage hier ist jedoch, warum Sie überhaupt einen Befehl dafür erstellen. Der Befehl gibt nichts zurück und Ihre _SearchMethode ist ein Prädikat, sodass sie keinen Status ändert. Der Aufruf des Befehls bewirkt nichts anderes als die Verschwendung von CPU-Zeit.
Der Typ- oder Namespace-Name '_ncReasearch' wurde nicht gefunden (Ihnen fehlt eine using-Direktive oder eine Assemblyreferenz). Fehler ungültiger Ausdrucksbegriff 'object'
Du erschaffst das Predicate<object>Falsche. Ein Prädikat dieses Typs erhält eine objectInstanz als Parameter und gibt boolals Ergebnis seiner Prüfung eine zurück. Auf der linken Seite des asOperators muss sich eine Instanz befinden und auf der rechten Seite der Typ, auf den hier gewirkt werden soll JobParameter.
NcView.Filter = new Predicate<object>(obj => _Search(obj as JobDocument));
Sie können sogar das objdirekt mögen (JobDocument) objund das Filterdirekt zuweisen .
NcView.Filter = obj => _Search((JobParameter) obj);
Lesen Sie mehr über den asBediener in der Dokumentation: als Bediener