2017-04-22 83 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