2017-04-22 9 views
1

私は最近、プリズムを使用してXamarin Formsアプリケーションを構築し始めました。プリズムを使用したMasterDetailナビゲーション

私はMasterDetailナビゲーションでナビゲートできません。移動するために使用するボタンは、バインディングを正しく作成していないようです。ボタンをクリックすると、ブレークポイントで実行されたコマンドに到達することはできませんでした。 コマンドバインディングを除くすべてが正しくバインドされているようですので、何が起こっているのかは分かりません。

私は既にプリズムチーム(HamburgerMenuプロジェクト)が提供しているGitHubサンプルをチェックアウトしました。私はサンプルと全く同じ設定を使用することを納得していますが、私のプロジェクトでそれを動作させる方法はありません。

ベローは、現在使用されているコードです:

MainPage.xamlを

<MasterDetailPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="MonkeyVault.Views.MainPage"> 
    <MasterDetailPage.Master> 
     <NavigationPage Title="Required Foo" Icon="ic_menu.png"> 
      <x:Arguments> 
       <ContentPage Title="Menu"> 
        <StackLayout Padding="40"> 
         <Label Text="{Binding UserName, StringFormat='Hello, {0}'}"/> 
         <Button Text="Sites" Command="{Binding NavigateCommand}" CommandParameter="Navigation/Sites" /> 
        </StackLayout> 
       </ContentPage> 
      </x:Arguments> 
     </NavigationPage> 
    </MasterDetailPage.Master> 
</MasterDetailPage> 

MainPageViewModel.cs

public class MainPageViewModel : BaseViewModel 
     { 
      #region Fields 

      private string _userName; 

      #endregion 

      #region Properties 

      public string UserName 
      { 
       get => _userName; 
       set => SetProperty(ref _userName, value); 
      } 

      public DelegateCommand<string> NavigateCommand; 

      public DelegateCommand NCommand; 

      #endregion 

      public MainPageViewModel(INavigationService navigationService) 
       : base(navigationService) 
      { 
       Title = "Main Page"; 

       NavigateCommand = new DelegateCommand<string>(OnNavigateCommandExecuted); 
      } 

      private async void OnNavigateCommandExecuted(string path) 
      { 
       await _navigationService.NavigateAsync(path); 
      } 
     } 

誰かがすでにこの問題が発生したか、私はGREATFULだろう任意のアイデアを持っていた場合。

+0

私はあまりにもPrismに精通していませんが、MasterDetailPageを使用してBIndingContextを作成する方法はありますか。 MasterDetailPageでは、マスターセクションとディテールセクションの両方でBIndingContextを適切なViewModelに設定する必要があります。 –

+0

@AdamPedleyこのビューは、ビューモデルへのデータバインディングを可能にする命名規則に従ってビューモデルに自動的に配線されます。それは動作し、 'UserName'プロパティのバインディングは意図的に機能していますが、コマンドバインディングだけがトリガされず、理由もわかりません。 – BrassMonkey

答えて

0

DelegateCommandをプロパティとして作成する必要があります。

public DelegateCommand<string> NavigateCommand { get; set; } 

確かに私はちょうどここに推測していますが、私は問題の前のフィールドに結合し、結合取得するプロパティにそれを変更する必要がありました。

+0

ありがとう!私は本当に理由を理解していませんが、うまくいきます。あなたは私の一日を作る! – BrassMonkey

+0

私はXamarinのBindingEngineについて掘り下げませんでしたが、バインディングするプロパティを取得するためにReflectionを使用する必要があるため、GetRuntimePropertyなどのメソッドを使用します。これらはプロパティを取得するだけです。フィールド。 –

+1

詳細な回答をお寄せいただきありがとうございます。いつものように、あなたは十分な情報を得ているようです。ちなみに、私は最近、https://xamarinhelp.com/でXamarinフォームに関するあなたの記事を読んだことがありました。それはよく書かれ、非常に多くの手の込んだ良いアドバイスが含まれています。私はあなたの次の記事を読むことを楽しみにしています。このような良い仕事を続けてください:) – BrassMonkey

関連する問題