簡體   English   中英

Xamarin.Forms 和 MvvmCross:導航和命令不起作用

[英]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.XMvvmCross.Forms 6.4.2Xamarin.Essentials 1.4.0Xamarin.Android.Support.XXX 28.XX 、...

  • HomePageSecondPage繼承自MvxContentPage<TViewModel> (在 C# 類和 XAML 文件中)。
  • HomeViewModelSecondVieWModel繼承自BaseViewModel ,后者繼承自MvxViewModel

我將BaseViewModel一些服務注入到構造函數中: IMvxNavigationServiceMyApp.Core.Services.IMyCustomService 它們有效: IMyCustomServiceMyApp.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 意外行為

命令仍然不可用

當我在 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;
}

當我一步一步調試時:

  1. HomeViewModel.Initialize()被調用。 var result = await NavigationService.Navigate<SecondViewModel>(); 也。
  2. SecondViewModel.Initialize()
  3. 先前的result變量(在HomeViewModel.Initialize() )為true
  4. 該應用程序顯示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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM