.NET Maui - 如果存在未保存的数据或条件,则阻止选项卡导航

问题描述 投票:0回答:1

如果 .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 xamarin xamarin.forms maui
1个回答
0
投票

这是应用程序外壳 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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.