2016-04-07 17 views
-1

Ich habe eine Ansicht mit einem Bild, das eine Tippgeste auf einen Befehl gebunden hat:Kann ich in Xamarin Forms auf gebundenes Element aus dem Befehl zugreifen?

VIEW:

var clickableImage = new Image(...); 
var imageTap = new TapGestureRecognizer(); 
clickableImage.GestureRecognizers.Add(imageTap); 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand); 

Der Befehl ist in der View-Modell wie folgt aus:

VIEW MODELL

public ICommand MyCommand 
{ 
    get 
    { 
     return new Command((parameters) => 
     {    
      // Can I access imageTap element here? 
     }); 
    } 
} 

Gibt es einen Weg zu acce ss das ImageTap-Element aus dem Befehl, an den es gebunden ist?

+2

Wer auch immer downvoted - bitte sagen Sie mir warum. Ich lerne nichts, wenn du ohne Erklärung runterlegst. – jbyrd

+0

Andere haben Lösungen gepostet, wie Sie dies mit dem Befehlsparameter erreichen können. Ich werde nur hinzufügen, dass Sie wahrscheinlich überdenken sollten, warum Sie das überhaupt tun. Der Befehl befindet sich innerhalb des ViewModel, das ViewModel sollte kein Wissen über Ihre Ansicht haben, nur umgekehrt. MVVM hat eine saubere Trennung dieser Schichten und Sie laufen überall herum, wenn Sie Verweise auf das Bild übergeben oder vom Xamarin.Forms-Namespace überhaupt im Ansichtsmodell – irreal

+0

@irreal abhängen - also habe ich ein benutzerdefiniertes Element (im Grunde einen Block mit einem Symbol und verschiedenen Textteilen), die 4 Variationen hat. Basierend auf der Variation möchte ich, dass der Befehl etwas unterschiedliche Dinge tut - daher muss der Befehl wissen, welche Variation mein benutzerdefiniertes Element ist. Indem ich das Element in den Befehlsparameter übergebe, kann ich das tun. Macht das jetzt Sinn, oder meinst du immer noch, dass mein Ansatz problematisch ist? – jbyrd

Antwort

1

Ja, Sie können den Befehlsparameter verwenden.

Sie können diese Antwort/Post von einem unserer Ingenieure im Forms-Team beziehen. https://stackoverflow.com/a/25914911/85606

imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand); 
//Command parameter 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => imageTap); 

Die CommandParameter ist eine weitere bindbare Eigenschaft auf den TapGestureRecognizer, können Sie es auf einer anderen Leitung einstellen.

+0

Hmm, was würde das in C# -Code (vs XAML) aussehen? Und wie würde ich innerhalb des Befehls selbst auf das gebundene Element verweisen? – jbyrd

+0

@jbyrd siehe meine Bearbeitung –

+0

Wenn ich das versuche, erhalte ich eine Fehlermeldung "Angegebener Cast ist nicht gültig", direkt mit der CommandParameterProperty-Zeile verbunden. – jbyrd

1

Um ein wenig gründlicher zu erklären, wenn Sie das CommandParameter verwenden, wird das Objekt, an das Sie binden, als Parameter für die Aktion Ihres Befehls übergeben, wenn es ausgeführt wird. Sie müssen dann den Parameter auf den gewünschten Typ umwandeln, um ihn verwenden oder ändern zu können.

Zum Beispiel, wenn Sie einen Verweis auf das Bildelement aus Ihrem Befehl erhalten wollen würden Sie einrichten Sie steuern, wie so:

var clickableImage = new Image (...); 
var imageTap = new TapGestureRecognizer(); 
clickableImage.GestureRecognizers.Add(imageTap); 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand); 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => clickableImage); // clickableImage will be passed to MyCommand when it is run 

Dann in Ihrer MyViewModel Klasse, würden Sie Ihren Befehl einrichten like so:

public ICommand MyCommand 
{ 
    get 
    { 
     return new Command((parameter) => // the bound parameter (the Image element in this case) is passed in as an object 
     {    
      var clickableImage = (Image)parameter; // cast the parameter object to an Image. 
      // Use the element for whatever you need 
      ... 
     }); 
    } 
} 
+0

Wenn ich das versuche, erhalte ich den Fehler "Angegebener Cast ist nicht gültig", der direkt mit der CommandParameterProperty-Zeile zusammenhängt. – jbyrd

+0

Oh, das wäre, weil es nach einer Eigenschaft in der MyViewModel-Klasse sucht und clickableImage weder eine Eigenschaft ist noch in MyViewModel. Kannst du ein wenig mehr darüber erzählen, was du erreichen willst? In der Regel sollte das ViewModel die Sicht nicht in einem strengen MVVM-Sinne kennen. Ich würde glücklich sein zu helfen, wenn ich weiß, was dein Endziel ist. –