如果 .NET Maui 中不满足特定条件,如何阻止我的应用程序切换选项卡?
我需要在选项卡导航到单击的选项卡之前验证条件。如果不满足条件,则停止导航。
下面是我的选项卡栏 xaml 代码以及 on 属性更改的 C# 代码。我无法获取
GetDeferral();
来自我的 C# 代码
private void WorkOrderTabBar_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (sender is TabBar listener && listener.CurrentItem?.Navigation.NavigationStack.Count > 1)
{
//listener
var navigation = listener.CurrentItem.Navigation;
var pages = navigation.NavigationStack;
for (var i = pages.Count - 1; i >= 1; i--)
{
navigation.RemovePage(pages[i]);
}
}
}
<TabBar x:Name="Demo"
PropertyChanged="WorkOrderTabBar_PropertyChanged"
Route="Demo"
>
<Tab
Title="Report Info"
AutomationId="WorkOrdersDetailsTab"
Icon="reportinfo.png"
Route="WorkOrdersDetailsTab">
<ShellContent
Title="Work Orders Details Page Content Shell"
AutomationId="WorkOrdersDetailsPageShellContent"
ContentTemplate="{DataTemplate local:WorkOrderDetailsPage}" />
</Tab>
<Tab
Title="Report Info1"
AutomationId="WorkOrdersDetailsTab1"
Icon="reportinfo1.png"
Route="WorkOrdersDetailsTab">
<ShellContent
Title="Work Orders Details Page Content Shell"
AutomationId="WorkOrdersDetailsPageShellContent"
ContentTemplate="{DataTemplate local:WorkOrderDetailsPage1}" />
</Tab>
</TabBar>
这是应用程序外壳 XAML:
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="dap111.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:dap111"
Shell.FlyoutBehavior="Disabled"> <!--put in your namespace-->
<TabBar x:Name="Demo"
Route="Demo"
>
<Tab IsEnabled="{Binding IsEnabled1}"
Title="Report Info"
AutomationId="WorkOrdersDetailsTab"
Icon="reportinfo.png"
Route="WorkOrdersDetailsTab">
<ShellContent
Title="Work Orders Details Page Content Shell"
AutomationId="WorkOrdersDetailsPageShellContent"
ContentTemplate="{DataTemplate local:WorkOrderDetailsPage}" />
</Tab>
<Tab IsEnabled="{Binding IsEnabled2}"
Title="Report Info1"
AutomationId="WorkOrdersDetailsTab1"
Icon="reportinfo1.png"
Route="WorkOrdersDetailsTab">
<ShellContent
Title="Work Orders Details Page Content Shell"
AutomationId="WorkOrdersDetailsPageShellContent"
ContentTemplate="{DataTemplate local:WorkOrderDetailsPage1}" />
</Tab>
</TabBar>
</Shell>
这是背后的App Shell代码:
namespace dap111; //put in your namespace
public partial class AppShell : Shell
{
ShellViewModel shellVm;
public AppShell()
{
InitializeComponent();
BindingContext = shellVm = new ShellViewModel();
shellVm.IsEnabled1 = true;
shellVm.IsEnabled2 = true;
}
protected override void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
if (args.Source == ShellNavigationSource.ShellSectionChanged)
{
var aCondition = true;
if (aCondition)
{
shellVm.IsEnabled1 = false;
}
}
}
}
这是视图模型
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace dap111 //put in your namespace
{
public class ShellViewModel : INotifyPropertyChanged
{
public bool _IsEnabled1;
public bool IsEnabled1
{
get => _IsEnabled1;
set
{
if (_IsEnabled1 != value)
{
_IsEnabled1 = value;
OnPropertyChanged(); // reports this property
}
}
}
public bool _IsEnabled2;
public bool IsEnabled2
{
get => _IsEnabled2;
set
{
if (_IsEnabled2 != value)
{
_IsEnabled2 = value;
OnPropertyChanged(); // reports this property
}
}
}
public ShellViewModel()
{
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string name = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}