通知 Activity viewModel 的变化

Notify Activity of changes in viewModel

我尝试在 Xamarin Android 应用程序中退出 'lock task mode'。这是我想要实现的目标:

  1. 用户点击标签(在 Xamarin.Forms 中查看)-> 它导致 ViewModel 的布尔值 属性 变为 true
  2. MainActivity (Xamarin.Android) 观察 属性 已更改为 true -> 它使应用程序退出 'lock task mode'

我的 viewModel 放置在 Xamarin.Forms 'App.xaml' class 中,因此可以在表单和 Android 部分访问它。

如何通知我的 Activity 属性 已更改,以便它可以退出锁定模式?我知道这可能是一个非常糟糕的解决方法,我很想听听任何建议和技巧,让它更专业。

提前致谢!

编辑

所以关键是我得到了带有布尔值 属性 exitLockMode 的 ViewModel,它指示应用程序是否应该处于锁定模式:

public class AdminViewModel : BaseViewModel
    {
        //Number of taps to touch at main banner in 'MainPage' to open Admin Window
        private int _tapsRequiredToAdmin = 5;
        //Number of tolerance in miliseconds between next taps
        private int _toleranceInMs = 1000;
        private bool _exitLockMode = false;

        
        public int ToleranceInMs { get => _toleranceInMs;  }
        public int TapsRequiredToAdmin { get => _tapsRequiredToAdmin; }

        public bool ExitLockMode
        {
            get => _exitLockMode;
            set => _exitLockMode=value;
        }
    }

AdminViewModel 创建于 'App.xaml' class:

public partial class App : Application
    {
        private static AdminViewModel _adminViewModel;


        public App()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new MainPage());
           
        }

        public static AdminViewModel AdminViewModel
        {
            get
            {
                if(_adminViewModel == null )
                    _adminViewModel = new AdminViewModel();
                return _adminViewModel;
            }
        }

        protected override void OnStart() { }

        protected override void OnSleep() { }

        protected override void OnResume() { }

        
        
    }

在我的主视图 (Xamarin.Forms) 中,我有一个标签,管理员想要点击几次以退出锁定模式:

private DateTime? LastTap = null;
        private byte NumberOfTaps = 0;
        AdminViewModel adminViewModel = App.AdminViewModel;

**********************************************
//This is method binded to Label in <TapGestureRecognizer Tapped="OnLabelTapped">

 private async void OnLabelTapped(object sender, EventArgs e)
        {
                if (LastTap == null || (DateTime.Now - LastTap.Value).TotalMilliseconds < adminViewModel.ToleranceInMs)
                {
                    if (NumberOfTaps == (adminViewModel.TapsRequiredToAdmin - 1))
                    {
                        NumberOfTaps = 0;
                        LastTap = null;
                        adminViewModel.ExitLockMode = true;

                        
                        return;
                    }
                    else
                    {
                        NumberOfTaps++;
                        LastTap = DateTime.Now;
                    }
                }
                else
                {
                    NumberOfTaps = 1;
                    LastTap = DateTime.Now;
                }
        }

现在我想实现当我将 'ExitLockMode' bool 变为 true 时,它​​会通知我的 'MainActivity' (Xamarin.Android) 触发 'StopLockTask()' 方法。我知道在原生 Android 中可以通过观察 bool 属性 来处理,但我不知道如何在这里做。

我是新手所以可能会很乱,感谢大家的帮助。

正如 Jason 所说,您可以使用 messagecenter.The Xamarin.Forms MessagingCenter class 实现 publish-subscribe 模式,允许 message-based 不方便 link 通过对象和类型引用的组件之间的通信。

此机制允许发布者和订阅者无需相互引用即可进行通信,有助于减少它们之间的依赖性。

您可以按照此文档和其中的示例进行操作 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/messaging-center