C# Xamarin窗体Shell ToolbarItem未响应命令绑定
我正在将Xamarin Forms非Shell应用程序转换为Shell格式。我遇到一个问题,在C# Xamarin窗体Shell ToolbarItem未响应命令绑定,c#,xaml,xamarin.forms,xamarin.android,C#,Xaml,Xamarin.forms,Xamarin.android,我正在将Xamarin Forms非Shell应用程序转换为Shell格式。我遇到一个问题,在ContentPage上定义的ToolbarItem在更改其可执行状态时没有响应绑定的命令。我通过在同一页面中添加标准按钮来验证这一点,并按照下面的xaml将它们绑定到相同的命令 <ContentPage.ToolbarItems> <ToolbarItem Text="Edit" Priority="1" Command="{Binding ToggleEditCommand
ContentPage
上定义的ToolbarItem
在更改其可执行状态时没有响应绑定的命令。我通过在同一页面中添加标准按钮来验证这一点,并按照下面的xaml将它们绑定到相同的命令
<ContentPage.ToolbarItems>
<ToolbarItem Text="Edit" Priority="1" Command="{Binding ToggleEditCommand}" Order="Primary"
Icon="{OnPlatform Android=ic_edit_white_24dp.png, UWP=Assets/Icons/ic_edit_dark_48dp.png}"/>
<ToolbarItem Text="Save" Priority="2" Command="{Binding SaveItemCommand}" Order="Primary"
Icon="{OnPlatform Android=ic_save_white_24dp.png, UWP=Assets/Icons/ic_save_dark_48dp.png}"/>
<ToolbarItem Text="Copy" Priority="3" Command="{Binding CopyItemCommand}" Order="Secondary"
Icon="{OnPlatform Android=ic_content_copy_white_24dp.png, UWP=Assets/Icons/ic_content_copy_dark_48dp.png}"/>
<ToolbarItem Text="Delete" Priority="4" Command="{Binding DeleteItemCommand}" Order="Secondary"
Icon="{OnPlatform Android=ic_delete_white_24dp.png, UWP=Assets/Icons/ic_delete_dark_48dp.png}"/>
</ContentPage.ToolbarItems>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackLayout>
<Button Text="edit" Command="{Binding ToggleEditCommand}"/>
<Button Text="Save" Command="{Binding SaveItemCommand}"/>
<Button Text="Copy" Command="{Binding CopyItemCommand}"/>
<Button Text="Delete" Command="{Binding DeleteItemCommand}"/>
</StackLayout>
<editviews:GameActionEditView IsVisible="{Binding IsVMInEditMode}" Grid.Row="1"/>
<Grid IsVisible="{Binding IsVMInViewMode}" Grid.Row="1">
<viewonly:GameActionView BindingContext="{Binding SelectedGameAction}"/>
</Grid>
PropertyChanged侦听器调用Can Execute方法
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
switch (e.PropertyName)
{
case "Title":
case "Effect":
case "SelectedActionCost":
HasUnsavedChanges = CheckForUnsavedChanges();
SaveItemCommand.ChangeCanExecute();
break;
case "IsVMInEditMode":
IsVMInViewMode = !IsVMInEditMode;
CopyItemCommand.ChangeCanExecute();
SaveItemCommand.ChangeCanExecute();
DeleteItemCommand.ChangeCanExecute();
ToggleEditCommand.ChangeCanExecute();
break;
}
}
最后,可以执行save命令的方法
protected override bool CanSaveItem()
{
if (!IsVMInEditMode) return false;
if (string.IsNullOrWhiteSpace(Title)) return false;
if (string.IsNullOrWhiteSpace(Effect)) return false;
if (Title.Length > 40) return false;
if (Effect.Length > 1000) return false;
if (SelectedActionCost == null) return false;
return true;
}
**编辑2:添加回购链接**
我已经成功地在VisualStudio(2019,v16.4.0)的Shell模板中复制了这个问题。可以找到Repo我们可以看看你的虚拟机代码吗?我也想看看你的虚拟机代码。我不能在我这方面重复这个问题。从第二张gif来看,工具栏项似乎已被禁用。@JackHua MSFT我已经添加了视图模型中我认为相关的部分,考虑到帖子的大小。让我知道,如果你想要任何进一步的帮助。好的,我只是测试的样本,发现它只发生在Android端。如果我将_state的默认值更改为true,它也可以正常工作。如果我找到任何解决方案,我会更新你。另外,有人制造了一个问题。我们可以看看你的虚拟机代码吗?我也想看看你的虚拟机代码。我不能在我这方面重复这个问题。从第二张gif来看,工具栏项似乎已被禁用。@JackHua MSFT我已经添加了视图模型中我认为相关的部分,考虑到帖子的大小。让我知道,如果你想要任何进一步的帮助。好的,我只是测试的样本,发现它只发生在Android端。如果我将_state的默认值更改为true,它也可以正常工作。如果我找到任何解决方案,我会通知你。另外,有人制造了一个问题。
protected override bool CanSaveItem()
{
if (!IsVMInEditMode) return false;
if (string.IsNullOrWhiteSpace(Title)) return false;
if (string.IsNullOrWhiteSpace(Effect)) return false;
if (Title.Length > 40) return false;
if (Effect.Length > 1000) return false;
if (SelectedActionCost == null) return false;
return true;
}