2015-04-15 15 views
7

Sto scrivendo l'applicazione Xamarin e ho trovato la differenza tra WPF che non posso incrociare.Pulsante di associazione Xamarin Form Comando al genitore BindingContext

Sto utilizzando Xamarin Forms Labs per ottenere il controllo del ripetitore.

Ho un ripetitore, che ripete DataTemplate:

<DataTemplate> 
    <Button Text="{Binding Text}" Command="{Binding CategorySelectedCommand}" /> 
</DataTemplate> 

ma vorrei spostare l'esecuzione di comandi al mio UserControl Binding Contesto.

Normalmente con WPF sarebbe simile:

Command={Binding ElementName=myUserControl, Path=DataContext.CategorySelectedCommand} 

ma non avere la proprietà ElementName.

Ho scoperto che ho potuto impostare BindingContext del mio pulsante mi piace questo:

BindingContext="{x:Reference myUserControl}" 

Ma allora non posso associare proprietà Text al testo di mio tasto.

Come devo fare?

+0

Avete trovato una soluzione a questo? Sembra che 'Source' non funzioni con un DataTemplate. È un vero peccato, rende difficile fare MVVM reale. – MrZander

+0

Nevermind. Ero indietro sugli aggiornamenti. Sembra che funzioni adesso. – MrZander

risposta

11

È possibile utilizzare la proprietà Source per specificare un'origine per l'associazione che verrà utilizzata al posto dell'attuale BindingContext. Quindi il testo può provenire dal contesto di binding della pagina e dal comando da qualche altra parte.

Command="{Binding CategorySelectedCommand, Source={x:Static me:SomeStaticClass.YourUserControl}}" 

o

Command="{Binding CategorySelectedCommand, Source={DynamicResource yourUserControlKey}}" 

o

Command="{Binding CategorySelectedCommand, Source={x:Reference myUserControl}}" 

Ecco un esempio completo. Un problema comune è non implementare INotifyPropertyChanged e impostare la proprietà dopo la chiamata a InitializeComponent().

XAML

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="test.MyPage" x:Name="ThePage"> 
    <Label Text="{Binding TextProp, Source={x:Reference ThePage}" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" /> 
</ContentPage> 

codice dietro

public partial class MyPage : ContentPage 
{ 
    public MyPage() 
    { 
     this.TextProp = "Some Text"; 
     InitializeComponent(); 
    } 

    public string TextProp 
    { 
     get; 
     set; 
    } 
} 
+0

Ho un 'ContentPage' con x: Name' wireframe'. In ViewModel di questa pagina ho la proprietà 'MainText'. Poi nel DataTemplate devo Etichetta: '' E non funziona. Ho provato anche 'Path = BindingContext.MainText'. Nessun successo – Tomasz

+0

La proprietà è pubblica? – Krumelur

+1

ovviamente è pubblico – Tomasz

Problemi correlati