2014-09-18 5 views
9

Vorrei passare uno Xamarin.Forms.Button nel proprio Command come CommandParameter al mio ViewModel. So come ottenere ciò dal codice alla base, ad es. ...Come si passa il pulsante come CommandParameter da XAML in una pagina Xamarin.Forms?

XAML(con la maggior parte delle proprietà perso fuori per brevità)

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

XAML.cs

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

     myButton.CommandParameter = myButton; 
    } 
} 

ViewModel

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; } 
} 

... MA è possibile dichiarare lo CommandParameter nello stesso XAML? O in altre parole qual è la sintassi del binding per impostare il parametro sul pulsante stesso?

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

btw ho già provato CommandParameter="{Binding RelativeSource={RelativeSource Self}}" e che non ha funzionato.

Grazie,

+0

Perché è necessario il pulsante nella VM? –

+0

Ciao @AlexAnderson. Sì, non ne sono molto entusiasta. Stiamo introducendo Xamarin.Forms in un progetto Xamarin iOS esistente. Sperimenta solo come ottenere un UIPopoverController nativo da mostrare da una pagina Xamarin.Form. Non esiste il supporto per i moduli per i popup, quindi, osservando solo i modi per aggirare il problema al momento e uno degli ostacoli, è necessario conoscere quale UIElement mostrare il popup da ... quindi passare il pulsante. Come ho detto ... sembra un po 'cavolo. Vado a provare il tuo suggerimento qui sotto. Grazie –

+0

Per quanto riguarda i popup, controlla l'implementazione di 'ContentPage.DisplayActionSheet (...)' - se il foglio d'azione non è abbastanza puoi decodificare il codice che lo mostra. E ottenere il riferimento Button richiederà comunque di trovare il riferimento UIButton da quello. Stai andando meglio con un renderizzatore personalizzato –

risposta

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

dovrebbe funzionare, ma im ancora in perdita perché è necessario il pulsante? Il punto di MVVM è separare i dati e l'interfaccia utente. tutto ciò che dovrebbe essere necessario per il pulsante può essere fatto tramite DataBindings.

Se il non funziona sopra, l'unica altra cosa da provare è quello di dare il pulsante una x: Tasto e CommandParamter = {StaticResource 'x: Key'}

+1

I collegamenti 'Xamarin.Forms' non hanno alcuna proprietà' RelativeSource', né un'estensione di markup 'RelativeSource'. –

+0

Ciao @AlexAnderson ... sì nessuno di questi suggerimenti ha funzionato temo. –

16

Xamarin.Forms ha un'estensione di riferimento di markup che fa proprio questo :

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

Anche se, questa è la prima volta che vedo questo bisogno, e probabilmente può meglio separare i vista dal vostro ViewModels e risolvere questo utilizzando un modello più pulito, o non condivisione di un comando attraverso i pulsanti.

+0

Ciao @StephaneDelcroix. Purtroppo non ha funzionato neanche .. "L'eccezione è stata lanciata dall'obiettivo di un'invocazione". –

+0

potresti condividere una traccia dello stack?stai usando xmll xmln 2009? stai usando la versione più recente (1.2.2 o 1.2.3-pre2) di XF? –

+0

Mi dispiace @GavinSutherland, ma l'ho appena testato su 1.2.3-pre-2 e funziona come previsto. –