[英]Xamarin.Forms & MvvmCross : Navigation and commands not work
我創建了 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.XX
、...
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);
當我在 Entry 中鍵入某些內容並綁定到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
...
我可以覆蓋ViewAppeared
方法而不是Initialize
任務:
public class HomeViewModel
{
/* Ommited code */
public override async Task Initialize()
{
IsBusy = true;
var items = await MyCustomService.GetItemsAsync();
// ...
}
public override void ViewAppeared()
{
base.ViewAppeared();
if (true)
{
NavigationService.Navigate<MissionsViewModel>();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.