Suchfilter C # WPF korrigieren

Oct 29 2020

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:

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

    Argument 1: Konvertierung von 'Methodengruppe' in 'System.Action' nicht möglich

  2. 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

1 thatguy Oct 29 2020 at 18:43

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