Xamarin.Forms激活/停用不起作用的工具栏项

时间:2018-05-19 09:35:36

标签: xamarin.forms

我有一个Xamarin.Form MainPage:ContentPage,顶部有一个ToolbarItems Bar。工具栏项目绑定到我的ViewModel,如下所示:

    <ToolbarItem Text="Sync" Command="{Binding ReloadCommand}" >
    </ToolbarItem>

项目的可用性取决于某些逻辑:

    private bool canReloadExecute(object arg)
    {

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

在另一个设置页面上有一个单独的对话框控制DeviceID和BuildingID。一旦输入任何这些ID,它就会被持久存储

 App.SetPersistentSetting("DeviceID",value);

问题是,一旦我的代码使用popAsync()返回主页面,菜单项就不会改变它们的外观。我需要重启我的应用才能看到更改。根据调试器,不调用canReloadExecute。 为什么会这样?

我尝试解决此问题的方法是强制刷新MainPage的OnAppearing方法,如下所示:

    public void RefreshToolbarItems()

    {
        TestApp.ViewModels.MainViewModel mvm = (TestApp.ViewModels.MainViewModel)BindingContext;
        mvm.RefreshToolbarItems();
    }

...并在ViewModel中:

    public void RefreshToolbarItems()
    {
        OnPropertyChanged("BuildingScanCommand");
        OnPropertyChanged("ReloadCommand");
    }

但是这段代码运行但没有任何改变,而调试器显示例程确实正在触发事件,它们似乎无处可去。

我有什么想法可以让菜单上线吗?

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

我并不吝啬你的意思,但这里是处理命令的整个代码:

    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。所以问题是,我该如何触发呢?

1 个答案:

答案 0 :(得分:0)

我终于自己解决了这个问题,这段代码很适合我:

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