【发布时间】:2020-02-26 23:54:09
【问题描述】:
我创建了 4 个项目:
-
MobileApp.Core,其中包含我的业务代码(.NET Standard 2.0 库) -
MobileApp.Droid(适用于 Android 9) -
MobileApp.iOS(适用于 iOS 11) -
MobileApp.UI,其中包含 Xamarin.Forms 项目 (XAML)
...带有一些 NuGet 包:Xamarin.Forms 4.4.0.X、MvvmCross.Forms 6.4.2、Xamarin.Essentials 1.4.0、Xamarin.Android.Support.XXX 28.X.X、...
-
HomePage和SecondPage继承自MvxContentPage<TViewModel>(在 C# 类和 XAML 文件中)。 -
HomeViewModel和SecondVieWModel继承自BaseViewModel,后者继承自MvxViewModel。
我的BaseViewModel 中有一些服务注入到构造函数中:IMvxNavigationService、MyApp.Core.Services.IMyCustomService。它们有效:IMyCustomService 注册在 MyApp.Core.App.Initialize() 方法中。
在我的HomeViewModel 中,我有一个MyText 属性(绑定到Entry:<Entry Text="{Binding MyText}"/>)和一个命令(绑定到ToolbarItem:<ToolbarItem Text="Ok" Command="{Binding OkCommand}"/>):
private string _myText;
public string MyText
{
get => _myText;
set => SetProperty(ref _myText, value);
}
public IMvxCommand OkCommand => new MvxAsyncCommand(ExecuteOkCommandAsync, CanExecuteOkCommand);
private async Task ExecuteOkCommandAsync()
{
await MyCustomService.SomeAsyncWork(); // it works
await NavigationService.Navigate<MissionsViewModel>();
}
private bool CanExecuteOkCommand() => !string.IsNullOrWhiteSpace(MyText);
2 意外行为
命令仍然不可用
当我在我的条目中键入某些内容并绑定到MyText 属性时,该命令仍然不可用。我不知道为什么。 _myText 真的设置好了。
当我通知我的属性已更改时,我尝试使用 SetProperty(ref T storage, T value, Action afterAction, string propertyName) 并调用 OkCommand.RaiseCanExecuteChanged():
public string MyText
{
get => _myText;
set => SetProperty(ref _myText, value, () => OkCommand.RaiseCanExecuteChanged(), nameof(MyText));
}
我的命令仍然不可用。目前,它处于待机状态,我已将 CanExecuteOkCommand 替换为 () => true。
无法从HomeViewModel.Initialize() 方法导航(✔ 已解决)
现在,如果某些情况属实(文件存在),我想从 HomeViewModel 导航到 SecondViewModel。我不需要参数。
在ExecuteOkCommandAsync 方法中,我调用await NavigationService.Navigate(typeof(SecondViewModel));。当我从这里导航时(调用命令),没关系。
但是当我尝试从 HomeViewModel.Initialize() 方法导航时,我看到了 HomeViewModel 的视图,工具栏中有一个 *back* 按钮:
public override async Task Initialize()
{
IsBusy = true;
if (true) // a real condition : if file exists, today is monday, ...
{
var result = await NavigationService.Navigate<SecondViewModel>();
}
var items = await MyCustomService.GetItemsAsync();
Items = new ObservableCollection<Item>(items);
IsBusy = false;
}
当我一步步调试时:
HomeViewModel.Initialize()被调用。var result = await NavigationService.Navigate<SecondViewModel>();也是。SecondViewModel.Initialize()被调用。- 之前的
result变量(在HomeViewModel.Initialize()中)是true。 - 应用程序显示
HomePage(而不是预期的SecondPage)。
当我点击工具栏中的“确定”按钮时,我可以导航到真正的SecondPage(显然还有他的SecondViewModel)。
当我按下返回按钮时,从 HomePage 导航到 SecondPage...
【问题讨论】:
-
如果在任何可能的交互之前条件为真,我发现从
HomePage导航到SecondPage的唯一方法是覆盖ViewAppeared方法。
标签: c# xamarin xamarin.forms