2017-10-02 4 views
3

Ich versuche, meine Masterdetailpage Detail von Viewmodel zu binden. Aber es funktioniert nicht.MasterDetailPage von ViewModel in Xamarin Forms binden

Hier ist mein Code im Blick:

<?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:MasterDetailsSamp1" 
     x:Class="MasterDetailsSamp1.MainPage" 
     xmlns:vm="clr-namespace:MasterDetailsSamp1.ViewModels"> 
<MasterDetailPage.BindingContext> 
    <vm:MasterDetailsViewModel/> 
</MasterDetailPage.BindingContext> 

<MasterDetailPage.Master> 
    <ContentPage Title="Menu"> 
     <StackLayout> 

     </StackLayout> 
    </ContentPage> 
</MasterDetailPage.Master> 

<MasterDetailPage.Detail> 
    <NavigationPage> 

    </NavigationPage> 
</MasterDetailPage.Detail> 

Hier ist mein Code in meinem Viewmodel

public MasterDetailsViewModel() 
{ 
    MasterDetailPage masterDetailPage = new MasterDetailPage 
    { 
     Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(HomePage))) 
    }; 
} 

Es funktioniert, wenn ich diese Codezeile setzen

Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(HomePage))) 

Hinter Code, aber ich möchte es vom Ansichtsmodell erreichen.

Bitte helfen. Vielen Dank im Voraus

Antwort

1

Sie müssen sich auf Ihre Master- und Detail verbindlich Kontext wie das hinzuzufügen:

<?xml version="1.0" encoding="UTF-8" ?> 
<MasterDetailPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    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> 
     </ContentPage> 
    </MasterDetailPage.Detail> 
</MasterDetailPage> 

Um die Detailseite in Ansichtsmodell zu ändern Ich benutze diese:

(Application.Current.MainPage as MasterDetailPage).Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(YOURDETAILPAGE))); 

Ich bin Nicht sicher, ob es der beste Weg zu diesem Job ist, müssen MVVM- und MasterDetail-Dokumentationen klargestellt werden.

Vergessen Sie nicht, dass Ihr Bindungskontextelement INotifyPropertyChanged implementieren muss, um zu funktionieren.

Hoffe diese Hilfe.

+0

Ja, ich weiß. Was ich meine ist, dass das von ViewModel aufgerufen werden sollte und nun ein Contentpage-Layout innerhalb der MasterDetailPage.Detail erstellt wird :) – jsonGPPD

+0

Zum Schluss habe ich auch meine INotifyPropertyChanged in meinem ViewModel und alles funktioniert. Das Problem ist, wenn ich diesen Code "Detail = new NavigationPage ((Page) Activator.CreateInstance (typeof (HomePage))" in meinem Viewmodel, es funktioniert nicht. Aber wenn Sie das nach dem InitializeComponent() der Seite hinter den Code stellen, funktioniert es. – jsonGPPD

+0

Ich habe einen Fehler. Es heißt "System.Reflection.TargetInvocationException: " – jsonGPPD

Verwandte Themen