我有一个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。所以问题是,我该如何触发呢?
答案 0 :(得分:0)
我终于自己解决了这个问题,这段代码很适合我:
public void RefreshToolbarItems()
{
((Command)BuildingScanCommand).ChangeCanExecute();
((Command)ReloadCommand).ChangeCanExecute();
}