2017-07-09 2 views
0

Xamarin mit Hilfe von Formularen & PCLPrism VM mit Blick in Suchrufcode Bindung hinter

ich viele Beispiele und Schnipsel über Bindung VM mit Blick in den Page.xaml sah

mit diesem Block

xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
     prism:ViewModelLocator.AutowireViewModel="True" 

Und was, wenn ich das Ansichtsmodell innerhalb des Seitencodes (Page.cs) binden möchte.

Antwort

0

Sie können das Ansichtsmodell einfach neu erstellen und auf BindingContext setzen.

public Page() 
{ 
    InitializeComponent(); 
    this.BindingContext = new MyViewModel(); 
} 

==== ==== EDITED

Wenn Ihr Ansichtsmodell mit Parametern ist, inject des Abhängigkeits benötigen und Sie wollen es richtig lösen.

App.xaml.cs

protected override void OnInitialized() 
{ 
    ... 
    Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType<IMyViewModel, MyViewModel); 
    ... 
} 

Page.xaml.cs

public Page() 
{ 
    InitializeComponent(); 
    var viewModel = Microsoft.Practices.Unity.UnityContainerExtensions.Resolve<IMyViewModel>(((App)Application.Current).Container); 
    this.BindingContext = viewModel; 
} 
+0

Was kann ich tun, wenn die Ansichtsparameter PageViewModel (INavigationService navigationService, IPageDialogService pageDialogService) –

+0

In diesem Fall müssen Sie das ViewModel mithilfe der Abhängigkeitsinjektion auflösen. Sie können Ihre App-Klasse statisch zugänglich machen. Rufen Sie dann App.Container.Resolve ([Ihr Viewmodel-Typ]) auf. Aber bevor dies funktionieren kann, müssen Sie das Viewmodel im Container registrieren, indem Sie Container.RegisterType ([Ihr Viewmodelltyp], Viewmodel-Klasse) aufrufen – lowleetak

+0

könnte ich es trotz meines Containers vom Typ Dryioc.Icontainer immer noch verwenden. –

1

diesem Fall können Sie die beiden Parameter auf Klasse instanziiert passieren müssen, weil Sie zwei Parameter in Konstruktor benötigt haben. Probieren Sie den folgenden Code aus.

public Page() 
{ 
    InitializeComponent(); 
    this.BindingContext = new PageViewModel(Navigation,PageDialogService); 
} 
0

In meinem Fall

entfernt ich von Page.xaml

 xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
    prism:ViewModelLocator.AutowireViewModel="True" 

und in den Code Behind (page.cs)

i

hinzugefügt
public Page() 
    { 
      InitializeComponent(); 
      this.BindingContext = new pageViewModel(null,null); 
    } 

und es hat für mich funktioniert

+0

Aber Ihr NavigationService und PageDialogServer sind null im viewmodel – lowleetak

+0

Ich stimme Ihnen zu, dass auf einigen Seiten der _navigationservice einen Wert hat und in anderen ist es null, aber immer noch für beide Fälle, ich wünschte, Sie versuchen, es mir zu erklären. –

2

Sie können hinter den Zugriff auf Viewmode von Code erhalten, ist einfach durch Ihre Bindungskontext

var pageViewModel = (PageViewModel)this.BindingContext; 

Es funktioniert für mich typecasting.

Verwandte Themen