Wie kann ich veranlassen, dass das Tapped-Ereignis einer ViewCell einen Parameter an eine generische Funktion sendet und dann eine Auswahl für dieses ViewCell-Element öffnet?

9

Update: Nur zur Erinnerung, es gibt einen Bonus von 500 Punkten, wenn mir jemand zeigen kann, wie ich diese Funktionalität ohne Gesten & gt; implementieren kann

Ich verwende eine ViewCell und eine Gestenerkennung, um eine Auswahl mit dem folgenden Code zu öffnen. Das ViewCell verfügt über eine Beschriftung auf der linken Seite und einen Beschriftungsbereich auf der rechten Seite, der beim Start der App und später beim Klicken auf die ViewCell mit der Auswahl gefüllt wird.

XAML

%Vor%

C # Dies funktioniert für verschiedene Picker (ati, bti, pti usw.) mit CommandParameter

%Vor%

Ich möchte die Verwendung von TapGestureRecognizers entfernen, möchte aber weiterhin die Funktionalität und das Layout beibehalten.

Es wurde mir vorgeschlagen, dass es besser wäre, wenn ich das Tapped-Ereignis der ViewCell wie folgt verwenden würde:

%Vor%

Kann jemand etwas genauer erklären, wie ich das in C # anschließen könnte? Wäre ich am besten, etwas in das CommandViewModel sowie in den C # -Backing-Code zu codieren. Kann das View-Modell auch eine Methode haben, die ein Argument verwendet, um verschiedene Picker zu öffnen?

Ein Beispiel, wie ich das machen könnte, würde ich sehr schätzen. Beachten Sie, dass ich das CommandViewModel nicht unbedingt verwenden muss, wenn es möglich ist, dies durch Kodieren im .cs-Backing-Code zu erreichen.

    
Samantha J T Star 28.07.2017, 11:19
quelle

2 Antworten

2

(Sorry für das arme Englisch)

Obwohl es sich nicht um eine bewährte Methode handelt, können Sie so etwas tun, indem Sie das Viewmodel ablehnen:

XAML:

%Vor%

C #:

%Vor%

Beantworten Sie Ihre Frage "Kann das Ansichtsmodell eine Methode haben, die ein Argument annimmt?", ist es genau das, was Sie bereits mit der Methode 'OpenPickerCommand' machen. Das Problem besteht darin, dass Sie mit dem öffentlichen Ereignis von ViewCell 'Tapped' keine Parameter für den Delegate-Handler festlegen können.

Lassen Sie es mich wissen, wenn es für Sie funktioniert oder wenn Sie weitere Informationen benötigen.

Ich hoffe, es hilft.

    
Diego Rafael Souza 02.08.2017, 23:08
quelle
1
  • Das erste Problem ist, dass Sie den Code-Behind und MVVM mischen Ansätze im selben Code. Es ist verwirrend und schon gar nicht das richtige Weise zu codieren, was Sie erreichen möchten. Also, alles Kommandieren muss Im ViewModel an die View angehängt sein, kein Code-Behind auseinander Code wird nur für UI-Effekte verwendet.
    • Es ist nicht notwendig, einen Gestenerkenner für alle visuellen Objekte zu definieren, da Sie nur die Berührung auf der gesamten Oberfläche der Blickzelle erkennen wollen. Um dies zu erreichen, müssen Sie alle untergeordneten Elemente der ViewCell mit InputTransparent = true definieren. Der Tap wird also nicht erkannt und wird vom übergeordneten ViewCell (Sie muss das InpuTransparent anzeigen, da kein Tap-Ereignis vorliegt sprudelt in X.Forms).
    • Das Anzeigen und Verbergen der Auswahl ist ein View-Problem, kein ViewModel-Problem. Hier können Sie Code-Behind verwenden, um einen Ereignishandler für das angeklickte ViewCell-Ereignis zu erstellen. Dieser Handler setzt visible = true auf dem Picker.
    • Das ausgewählte Ereignis des Pickers muss mit einem entsprechenden Befehl im ViewModel verbunden sein. Jedes Mal, wenn der Picker angezeigt wird und ein Wert ausgewählt wird, wird das Viewmodel über die Aktion informiert. Dies ist der einzige Befehl, den Sie in Ihrem Ansichtsmodell benötigen. Abhängig von der XForms-Version hat der Picker keinen bindbaren Befehl. Sie können also eine der zahlreichen "bindablepicker" -Implementierungen verwenden, die Sie im Internet finden, oder Sie können auch ein XAML-EventToCommand-Verhalten verwenden.

Es gibt also zwei verschiedene Probleme: den Picker anzeigen / verstecken, was direkt in XAML oder mit Hilfe von Code-Behind erreicht werden kann; und die Auswahl des Auswahlelements, die mit einem Befehl im Ansichtsmodell verwaltet werden muss.

Ich hoffe, dies wird Ihnen helfen

    
Olivier 02.08.2017 18:00
quelle

Tags und Links