2014-09-18 5 views
9

Ich würde gerne eine in ihrem eigenen Command als CommandParameter zu meinem ViewModel übergeben. Ich weiß, wie dies vom Code hinter z.B. ...Wie übermittele ich den Button als CommandParameter von XAML in einer Xamarin.Forms-Seite?

XAML(mit den meisten Eigenschaften verpassten der Kürze halber out)

<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}"/> 

XAML.cs

public partial class MyTestPage 
{ 
    public MyTestPage() 
    { 
     InitializeComponent(); 

     myButton.CommandParameter = myButton; 
    } 
} 

Ansichtsmodell

public class MyViewModel : ViewModelBase 
{ 
    public MyViewModel() 
    { 
     ButtonClickCommand = new Command(
      (parameter) => 
      { 
       var view = parameter as Xamarin.Forms.Button; 
       if (view != null) 
       { 
        // Do Stuff 
       } 
      }); 
    } 

    public ICommand ButtonClickCommand { get; private set; } 
} 

... ABER ist es möglich, die CommandParameter im XAML selbst zu deklarieren? Oder mit anderen Worten, wie lautet die Bindesyntax, um den Parameter auf die Schaltfläche selbst zu setzen?

<Button x:Name="myButton" 
     Text="My Button" 
     Command="{Binding ButtonClickCommand}" 
     CommandParameter="{[WHAT WOULD GO HERE]}"/> 

btw habe ich schon CommandParameter="{Binding RelativeSource={RelativeSource Self}}" versucht und das hat nicht funktioniert.

Danke,

+0

Warum brauchen Sie die Schaltfläche in Ihrer VM? –

+0

Hallo @Alexanderson. Ja, ich bin auch nicht besonders scharf darauf. Wir führen Xamarin.Forms in ein bestehendes Xamarin iOS-Projekt ein. Experimentieren Sie einfach mit Methoden, wie Sie einen nativen UIPopoverController von einer Xamarin.Form-Seite anzeigen lassen können. Es gibt keine Forms-Unterstützung für Popups, also schaue nur im Moment um es herum und eine der Hürden ist, dass ich wissen muss, welches UIElement das Popup von ... anzeigt, also die Taste weitergibt. Wie gesagt ... irgendwie fühlt sich hokey. Ich werde deinen Vorschlag unten versuchen. Danke –

+0

Wie für Popups überprüfen Sie die Implementierung von 'ContentPage.DisplayActionSheet (...)' - wenn das Aktionsblatt nicht genug ist, können Sie den Code, der es zeigt, zurückentwickeln. Und wenn Sie die Button-Referenz abrufen müssen, müssen Sie immer noch die UIButton-Referenz finden. Sie werden mit einem benutzerdefinierten Renderer besser –

Antwort

-1
<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}" 
    CommandParameter={Binding RelativeSource= 
           {RelativeSource 
           Mode=FindAncestor, 
           AncestorType={x:Type Button}}/> 

Sollte funktionieren, aber im immer noch ratlos, warum Sie die Taste benötigen? Der Sinn von MVVM besteht darin, Daten und UI zu trennen. Alles, was Sie brauchen, um den Knopf zu drücken, kann über DataBindings getan werden.

Wenn die oben nicht funktioniert, das einzige andere Sache, zu versuchen, die Schaltfläche, um eine x zu geben: Taste und CommandParamter = {Static ‚x: Key‘}

+1

'Xamarin.Forms'-Bindungen haben weder eine' RelativeSource'-Eigenschaft noch eine 'RelativeSource'-Markuperweiterung. –

+0

Hallo @Alexanderson ... ja keiner dieser Vorschläge funktioniert Ich habe Angst. –

16

Xamarin.Forms hat eine Referenz-Markup-Erweiterung, die nur das tut : ich bin dieses Bedürfnis zu sehen, und Sie wahrscheinlich besser trennen Ihre Ansichten von Ihrem Viewmodel und lösen diese durch ein sauberere Muster verwenden oder nicht teilen einen Befehl

<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}" 
    CommandParameter="{x:Reference myButton}"/> 

Obwohl dies das erste Mal ist, über Schaltflächen.

+0

Hallo @StephaneDelcroix. Leider hat das auch nicht funktioniert. "Eine Exception wurde vom Ziel eines Aufrufs ausgelöst." –

+0

könnten Sie eine Stack-Trace teilen?verwendest du die xaml 2009 xmlns? Verwenden Sie die neueste (1.2.2 oder 1.2.3-pre2) Version von XF? –

+0

Es tut mir leid @GavinSutherland, aber ich habe gerade dies auf 1.2.3-Pre-2 getestet und es funktioniert wie erwartet. –

Verwandte Themen