2017-07-09 129 views
0

使用Xamarin網頁代碼中有景結合形態& PCL棱鏡VM背後

我看到了很多的例子,段關於使用此塊

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

與景觀結合VM

如果我想在後面的頁面代碼(Page.cs)中綁定視圖模型該怎麼辦。

回答

0

您可以新建viewmodel並將其設置爲BindingContext。

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

==== ==== EDITED

如果您的視圖模型是需要依賴注入參數,要正確地解決它。

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

因此,如果視圖模型參數爲 PageViewModel(INavigationService navigationService,IPageDialogService pageDialogService) –

+0

在這種情況下,您需要使用依賴注入來解析ViewModel。你可以讓你的App類靜態訪問。然後調用App.Container.Resolve([viewmodel type])。但在此之前,您需要通過調用Container.RegisterType([viewmodel type],viewmodel class) – lowleetak

+0

將視圖模型註冊到Container中,儘管我的Dryioc.Icontainer類型的容器仍然可以使用它。 –

1

你必須通過對類兩個參數實例化,因爲你已經需要構造雙參數該案。嘗試下面的代碼。

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

在我的情況

我從page.xaml

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

和後面的碼內移除(page.cs)

我增加

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

它爲我工作

+0

但您的NavigationService和PageDialogServer將在視圖模型爲空 – lowleetak

+0

爲空,我同意你在某些頁面_navigationservice有一個值,而在其他的一些它是空的,但仍然適用於這兩種情況下,我希望你嘗試和解釋我。 –

2

你可以從代碼訪問視圖模式的背後,是通過簡單的類型轉換綁定上下文

var pageViewModel = (PageViewModel)this.BindingContext; 

這對我的作品。