2017-04-22 116 views
1

我最近開始使用Prism構建一個Xamarin Forms應用程序。使用棱鏡的MasterDetail導航

我無法使用MasterDetail導航進行導航。我用來導航的按鈕似乎不能正確地進行綁定。點擊按鈕時,我從來沒有能夠用斷點達到執行的命令。 除了命令綁定之外的所有東西似乎都正確地進行了綁定,所以我真的不知道發生了什麼。

我已經檢出了Prism團隊提供的GitHub示例(HamburgerMenu項目)。我說服使用與示例完全相同的配置,但沒有辦法使其適用於我的項目。

波紋管是目前使用的代碼:

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); 
      } 
     } 

如果有人已經遇到了這個問題或有任何想法,我將不勝感激。

+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