2017-11-27 9 views
0

私はナビゲーション用にMvvmCrossを使用してTabbedPageを実装しようとしています。問題は、MvvmCrossがViewModelの最初のナビゲーションを使用することです。これは、TabbedPageに子を追加する一般的なアプローチではうまくいきません。ページの作成中にnull以外のViewModelにアクセスすることはできませんが、OnBindingContextChangedにアクセスできます。Xamarin.Forms OnBindingContextChanged内のTabbedPageに子を追加する

は、ここで私がこれまで持っているものだ...

DashboardPage.xaml:

<?xml version="1.0" encoding="UTF-8"?> 
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     x:Class="DashboardPage" 
     xmlns:local="clr-namespace:CoreUI;assembly=CoreUI" 
     SelectedItem="{Binding CurrentSection, Mode=TwoWay}"> 
</TabbedPage> 

DashboardPage.xaml.cs:

public partial class DashboardPage : TabbedPage 
{ 
    public DashboardPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnBindingContextChanged() 
    { 
     var vm = (BindingContext as DashboardViewModel); 
     if (vm == null) 
     { 
      return; 
     } 

     ObservableCollection<MainMenuSection> sections = vm.MenuSections; 
     foreach (var section in sections) 
     { 
      MainMenuViewModel main_menu_vm = new MainMenuViewModel 
      { 
       Section = section 
      }; 

      // Question 2: 
      // Going against the MvvmCross grain here by referring to other pages from within a page, as opposed to doing everything from a ViewModel. How do I get around this? 
      Children.Add(new MainMenuPage(main_menu_vm)); 
     } 
    } 
} 

MainMenuPage.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="MainMenuPage" 
     xmlns:local="clr-namespace:CoreUI;assembly=CoreUI" 
     Title="{Binding Title}" > <!-- The tabs that are displayed on Dashboard have the correct labels, so Binding appears to be working here. --> 

    <ContentPage.Content> 
     <StackLayout x:Name="Body" IsVisible="false"> 
      <Label Text="{Binding Title}"/> <!-- Label doesn't get displayed, but does get displayed if Text is bound to something static, so Binding not quite working here. --> 
     </StackLayout> 
    </ContentPage.Content> 
</ContentPage> 

MainMenuPage.xaml.cs:

public partial class MainMenuPage : ContentPage 
{ 
    public MainMenuPage(MainMenuViewModel vm) 
    { 
     InitializeComponent(); 
     BindingContext = vm; 
    } 

    protected override void OnBindingContextChanged() 
    { 
     Body.IsVisible = true; 
    } 
} 

上記MainMenuPageは私がDashboardPage内の各タブの空白のページを取得することである、私のポイントを説明するために持っているものの簡易版です。

質問1:なぜタブページは空白ですか?

質問2:DashboardPage.xaml.csのコメントを参照してください。

答えて

-1

なぜあなたはこのすべてを自分でやりますか?あなたがサンプル(https://github.com/MvvmCross/MvvmCross/tree/develop/TestProjects/Playground/Playground.Forms.UI/Pages)で見ることができるように、あなたはMvxTabbePagePresentation属性であなたのビューを飾ることができ、MvvmCrossは残りの部分を処理します!

多くの機能を利用するには、Mvxタイプのページを使用することをお勧めします。

+0

MvvmCrossはこれまでに適切なAPIを手に入れようとしていますか?私たちはいつも試してみるためにソースコードを読む必要がありますか? – Ash