Xamarin.forms 使用棱镜的主细节导航

Xamarin.forms 使用棱镜的主细节导航,xamarin.forms,Xamarin.forms,我最近开始使用Prism构建Xamarin表单应用程序 我无法使用MasterDetail导航进行导航。我用来导航的按钮似乎无法正确绑定。当我点击按钮时,我从未能够通过断点访问已执行的命令。 除了命令绑定之外,其他一切似乎都正确地进行了绑定,所以我真的不知道发生了什么 我已经查看了Prism团队(HamburgerMenu项目)提供的GitHub示例。我确信使用与示例完全相同的配置,但无法使其在我的项目中工作 以下是当前使用的代码: MainPage.xaml <MasterDetailP

我最近开始使用Prism构建Xamarin表单应用程序

我无法使用MasterDetail导航进行导航。我用来导航的按钮似乎无法正确绑定。当我点击按钮时,我从未能够通过断点访问已执行的命令。 除了命令绑定之外,其他一切似乎都正确地进行了绑定,所以我真的不知道发生了什么

我已经查看了Prism团队(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);
            }
        }
公共类MainPageViewModel:BaseViewModel { #区域字段 私有字符串\u用户名; #端区 #区域属性 公共字符串用户名 { 获取=>\u用户名; set=>SetProperty(ref\u用户名,值); } 公共DelegateCommand导航命令; 公共授权司令部命令; #端区 公共主页视图模型(INavigationService导航服务) :base(导航服务) { Title=“主页”; NavigateCommand=新的DelegateCommand(OnNavigateCommandExecuted); } 私有异步void OnNavigateCommandExecuted(字符串路径) { wait_navigationService.NavigateAsync(路径); } }
如果有人已经遇到了这个问题,或者有任何想法,我会非常感激。

您需要将DelegateCommand创建为属性

public DelegateCommand<string> NavigateCommand { get; set; }
public DelegateCommand导航命令{get;set;}

诚然,我只是在这里猜测,但我以前在绑定到字段时遇到问题,需要将其更改为属性以获得绑定。

您需要将DelegateCommand创建为属性

public DelegateCommand<string> NavigateCommand { get; set; }
public DelegateCommand导航命令{get;set;}

诚然,我只是在这里猜测,但我以前绑定到字段时遇到问题,需要将其更改为属性才能进行绑定。

这不是因为我太熟悉Prism,而是因为MasterDetailPage的BIndingContext是如何生成的。在MasterDetailPage中,master和detail部分都应将其BIndingContext设置为相应的ViewModel。@AdamPedley此视图通过允许数据绑定到视图模型的命名约定自动连接到视图模型。它可以工作,“UserName”属性上的绑定按预期工作,只有命令绑定没有触发,我不知道为什么。不是因为我太熟悉Prism,而是MasterDetailPage的BIndingContext是如何生成的。在MasterDetailPage中,master和detail部分都应将其BIndingContext设置为相应的ViewModel。@AdamPedley此视图通过允许数据绑定到视图模型的命名约定自动连接到视图模型。它可以工作,“UserName”属性上的绑定按预期工作,只有命令绑定没有触发,我不知道为什么。非常感谢!我真的不明白为什么,但它工作得很好。你让我开心!虽然我还没有深入研究Xamarin中的BindingEngine,但由于必须使用反射来获取要绑定的属性,因此将使用诸如GetRuntimeProperty等方法。这些方法只能获取属性,因为您必须使用不同的方法来获取字段。感谢提供详细的答案。像往常一样,你似乎见多识广。顺便说一句,我最近很幸运地阅读了你们关于Xamarin表单的文章。它写得很好,包含了很多实用的好建议。我期待着阅读你的下一篇文章。请继续做这么好的工作:)非常感谢!我真的不明白为什么,但它工作得很好。你让我开心!虽然我还没有深入研究Xamarin中的BindingEngine,但由于必须使用反射来获取要绑定的属性,因此将使用诸如GetRuntimeProperty等方法。这些方法只能获取属性,因为您必须使用不同的方法来获取字段。感谢提供详细的答案。像往常一样,你似乎见多识广。顺便说一句,我最近很幸运地阅读了你们关于Xamarin表单的文章。它写得很好,包含了很多实用的好建议。我期待着阅读你的下一篇文章。请继续做这么好的工作:)