Xamarin.forms 表单激活/停用工具栏项不工作

Xamarin.forms 表单激活/停用工具栏项不工作,xamarin.forms,Xamarin.forms,我有一个Xamarin.FormMainPage:ContentPage,上面有一个工具栏项目栏。工具栏项绑定到我的ViewModel,如下所示: <ToolbarItem Text="Sync" Command="{Binding ReloadCommand}" > </ToolbarItem> 在不同的设置页面上,有一个单独的对话框控制DeviceID和BuildingID。一旦输入了这些ID中的任何一个,它就会被持久地存储起来 App.SetPe

我有一个Xamarin.FormMainPage:ContentPage,上面有一个工具栏项目栏。工具栏项绑定到我的ViewModel,如下所示:

    <ToolbarItem Text="Sync" Command="{Binding ReloadCommand}" >
    </ToolbarItem>
在不同的设置页面上,有一个单独的对话框控制DeviceID和BuildingID。一旦输入了这些ID中的任何一个,它就会被持久地存储起来

 App.SetPersistentSetting("DeviceID",value);
问题是,一旦我的代码使用popAsync()返回主页面,菜单项的外观就不会改变。我需要重新启动我的应用程序以查看更改。根据调试器,不会调用canReloadExecute为什么会这样?

我试图解决这个问题的方法是强制刷新主页的OnAppearing方法,如下所示:

    public void RefreshToolbarItems()

    {
        TestApp.ViewModels.MainViewModel mvm = (TestApp.ViewModels.MainViewModel)BindingContext;
        mvm.RefreshToolbarItems();
    }
。。。在ViewModel中:

    public void RefreshToolbarItems()
    {
        OnPropertyChanged("BuildingScanCommand");
        OnPropertyChanged("ReloadCommand");
    }
但是这段代码可以运行,但没有任何更改,尽管调试器显示例程确实在触发事件,但它们似乎没有任何作用

有什么办法让我的菜单继续吗

编辑1:“显示命令初始化”

我不是shre,你的具体意思是什么,但下面是处理该命令的全部代码:

    private ICommand _reloadCommand;
    public ICommand ReloadCommand => _reloadCommand ?? (_reloadCommand = new Command(ExecuteReloadCommand, canReloadExecute));
    private bool _isReloading = false;

    public bool IsReloading
    {
        get => _isReloading;
        set
        {
            _isReloading = value;
            ((Command)_reloadCommand).ChangeCanExecute();
            OnPropertyChanged(nameof(ReloadCommand));
        }
    }

   private bool canReloadExecute(object arg)
    {

        bool result = (!IsReloading && (App.GetPersistentSetting("DeviceID") != "") && (App.GetPersistentSetting("BuildingID") != ""));
        return result;
    }

    private async void ExecuteReloadCommand(object obj)

   {
        IsReloading = true;

        // Some code ...

        IsReloading = false;
    }
如果命令处理程序已经运行,或者DeviceID和/或BuildingId的配置尚未完成,则目标是禁用该命令

启用/禁用几乎可以工作,如果我设置DeviceId和BuildingId并重新启动应用程序,则该命令已正确启用或禁用。但是,如果我在子页面中设置ID并返回到主页面,则它不起作用


同时,我得出结论,启动onPropertyChange显然不会使命令检查其canReloadExecute。所以问题是,我如何触发它?

我最终自己解决了这个问题,这段代码对我来说很好:

    public void RefreshToolbarItems()
    {
        ((Command)BuildingScanCommand).ChangeCanExecute();
        ((Command)ReloadCommand).ChangeCanExecute();
    }

显示
命令
初始化i附加编辑1。如果你还需要什么,请告诉我。
    public void RefreshToolbarItems()
    {
        ((Command)BuildingScanCommand).ChangeCanExecute();
        ((Command)ReloadCommand).ChangeCanExecute();
    }