通知 Activity viewModel 的变化
Notify Activity of changes in viewModel
我尝试在 Xamarin Android 应用程序中退出 'lock task mode'。这是我想要实现的目标:
- 用户点击标签(在 Xamarin.Forms 中查看)-> 它导致 ViewModel 的布尔值 属性 变为 true
- 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
我尝试在 Xamarin Android 应用程序中退出 'lock task mode'。这是我想要实现的目标:
- 用户点击标签(在 Xamarin.Forms 中查看)-> 它导致 ViewModel 的布尔值 属性 变为 true
- 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