Xamarin.forms 单击时工具栏中的工具栏项未触发

Xamarin.forms 单击时工具栏中的工具栏项未触发,xamarin.forms,Xamarin.forms,我的代码如下。我不知道工具栏项的命令是否正确执行。编译时没有错误。单击baritem时,不会发生任何事情 --- Xaml <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local ="clr-namespace:SembIWIS.

我的代码如下。我不知道工具栏项的命令是否正确执行。编译时没有错误。单击baritem时,不会发生任何事情

--- Xaml

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"          
            xmlns:local ="clr-namespace:SembIWIS.View"  
            BackgroundColor="White"
            Title="Repair and Service"          
            x:Class="MyMainMenu">
    <ContentPage.ToolbarItems>
        <ToolbarItem Name="MenuItem1" Order="Primary" Icon="itemIcon1" Command="{Binding Item1Command}"  Priority="0" />
        <ToolbarItem Name="MenuItem2" Order="Primary" Icon="itemIcon2" Priority="1" />
    </ContentPage.ToolbarItems>   

    <local:Product>
    </local:Product>

    <local:Service>
    </local:Service>   

</TabbedPage>


--------- Code Behind:

public partial class MyMainMenu : TabbedPage
    {
        public ICommand Item1Command { get; private set; }

        public MyMainMenu()
        {
            InitializeComponent();

            BindingContext = this;

            NavigationPage.SetHasBackButton(this, true);   
            Init();
        }

        private void Init()
        {

          this.Item1Command = new Command((sender) =>
          {
               Navigation.PushAsync(new UpdateProduct());
          });


}
--Xaml
---------代码隐藏:
公共部分类MyMain菜单:选项卡页
{
public ICommand Item1Command{get;private set;}
公共MyMain菜单()
{
初始化组件();
BindingContext=这个;
NavigationPage.SetHasBackButton(此为true);
Init();
}
私有void Init()
{
this.Item1Command=新命令((发送方)=>
{
PushAsync(新的UpdateProduct());
});
}

从我收集的评论中可以看出,您忘记添加
BindingContext
。虽然您现在添加了它,但时间不对。在设置
BindingContext
之前,您需要执行
Init();
方法

设置了
BindingContext
后,此时所有内容都已连接,您所做的任何更改都不会被拾取,除非您正确实现了
INotifyPropertyChanged
接口。无论如何,对于此问题,请使您的代码适应以下情况:

public MyMainMenu()
{
    InitializeComponent();

    NavigationPage.SetHasBackButton(this, true);   
    Init();

    BindingContext = this;
}
关于评论中关于性能和单元测试的问题:


没有性能差异,因为无论您使用哪个MVVM框架,都只会执行相同的代码,它会自动为您执行。如果有任何差异,MVVM框架可能会稍微慢一点,因为它可能会使用反射或类似的方式解析您的ViewModels。如果您要执行单元测试,您将需要e将代码拆分为单独的ViewModel,并将其设置为BindingContext。例如,在使用具有单独视图和ViewModel的FreshMvvm时,请查看此操作。

您尚未为视图设置绑定上下文,因此
命令=“{binding Item1Command}”
不绑定任何内容。一个短期解决方法是在
MyMainMenu
构造函数中设置绑定上下文:
BindingContext=this;
,尽管您可能希望研究MVVM模式并将ViewModel移动到一个对UI一无所知的单独类。这是在同一页上完成的。您是否可以显示告诉我如何以及在哪里添加绑定上下文。我更新了注释以进行解释(我过早地按了enter键)@Damian我在上面的代码中添加了BindingContext=this。不知怎么的,它仍然不起作用。我遗漏了什么吗?只是一个想法。将这种方法与Mvvm命令绑定相比较,Mvvm命令绑定更容易进行单元测试?有什么性能差异吗?