2014-06-15 23 views
9

Finora, la maggior parte degli esempi che utilizzano Xamarin.Forms utilizza C# per creare l'interfaccia utente. Preferisco usare XAML per l'interfaccia utente e collegarlo a ViewModels.Associazione dati in XAML per MasterDetailPage in Xamarin.Forms

Non riesco a utilizzare Xamarin.Forms.MasterDetailPage in combinazione con XAML e non riesco a trasferire l'esempio C# in XAML + ViewModels.

Questa è la XAML ho ottenuto finora:

<?xml version="1.0" encoding="UTF-8" ?> 
<MasterDetailPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:NSContacten;assembly=NSContacten" 
    x:Class="MasterDetailExample.Main" 
    Title="Master Detail Example"> 

    <MasterDetailPage.Master BindingContext="{Binding Menu}"> 
     <ContentPage Padding="5, 25">    
      <StackLayout Orientation="Vertical"> 
       <Label Text="Master" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout>  
     </ContentPage> 
    </MasterDetailPage.Master> 

    <MasterDetailPage.Detail BindingContext="{Binding Detailpage}"> 
     <ContentPage Padding="5, 25">  
      <StackLayout Orientation="Vertical"> 
       <Label Text="Detail" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout>  
     </ContentPage> 
    </MasterDetailPage.Detail>  
</MasterDetailPage> 

Il componente funziona: lo faccio vedere il 'Master' e le etichette 'dettaglio'. Le etichette associate (sugli oggetti BindingContext) non vengono visualizzate.

Ho usato un sacco di combinazioni diverse, ma sono ancora bloccato: come funziona? Il mio binding non è corretto (dovrebbe essere su "ContentPage"), non posso collegarmi alle proprietà .Master e .Detail ecc.? Come dovrebbero apparire i collegamenti "Menu" e "Detailpage"?

Sarebbe un grande aiuto se qualcuno potesse darmi una mano! Il prossimo passo sarebbe che il .Detail verrà modificato quando un pulsante viene premuto in .Master. Grazie in anticipo!

+0

Grazie per aver chiesto questa domanda! Mi ci è voluto un giorno per cercare di capirlo e non avrei avuto senza questa domanda. –

risposta

16

tuo XAML è quasi ok, ma:

  • Il {BindingContext} non sono validi sulle proprietà e dovrebbe essere sulla ContentPage elementi
  • MasterDetailPage.Masterrichiedono un Page.Title da impostare, o tiri liberi.

Ecco il corretto Xaml lavora per me:

<?xml version="1.0" encoding="UTF-8" ?> 
<MasterDetailPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:NSContacten;assembly=NSContacten" 
    x:Class="MasterDetailExample.Main" 
    Title="Master Detail Example"> 

    <MasterDetailPage.Master> 
     <ContentPage Padding="5, 25" BindingContext="{Binding Menu}" Title="Master"> 
      <StackLayout Orientation="Vertical"> 
       <Label Text="Master" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout> 
     </ContentPage> 

    </MasterDetailPage.Master> 

    <MasterDetailPage.Detail> 
     <ContentPage Padding="5, 25" BindingContext="{Binding Detailpage}"> 

      <StackLayout Orientation="Vertical"> 
       <Label Text="Detail" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout> 

     </ContentPage> 
    </MasterDetailPage.Detail> 
</MasterDetailPage> 

ho provato con un tipo anonimo come il modello visualizzazione della pagina:

public MyMDPage() 
{ 
    InitializeComponent(); 
    BindingContext = new { 
     Menu = new { Subtitle = "I'm Master" }, 
     Detailpage = new { Subtitle = "I'm Detail" } 
    }; 
} 

e questo funziona bene. Nel tuo caso, probabilmente desideri tipi concreti anziché anonimi per il tuo modello di visualizzazione, ma hai un'idea.

+0

Grazie Stephane, ha funzionato alla grande! Il Page.Title su .Master potrebbe essere rimosso (almeno per iOS, non ha controllato altre piattaforme), ma il "BindingContext" per MasterDetailPage era la chiave per la mia soluzione. Grazie ancora! – MarcoK

+2

@MarcoK: non stai eseguendo l'ultima versione se il titolo non è obbligatorio. Fai un aggiornamento su nuget –

+0

Grazie mille per questa risposta. Sebbene io stia usando la proprietà bindable in Xamarin.Forms la logica è la stessa. –

Problemi correlati