Xamarin.ios: 详细命令为空,因为它显示在功能之前

Xamarin.ios: Detail command is null because it shows before function

我正在使用 Xamarin.ios MvvmCross 构建一个 iOS 应用程序。我有一个函数,每天将一个随机 ID 放入文本文件中。所以我得到了当天的食谱。

问题是详细命令函数(按钮)的代码在将所有内容存储在文本文件中的函数之前 运行s。所以 detail 命令 returns null 当我按下按钮时没有任何反应。第二次我 运行 代码执行了它应该执行的操作,因为文本文件中已经存储了一个 ID。

观点:

 public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        MvxFluentBindingDescriptionSet<TabHomeView, TabHomeViewModel> set = new MvxFluentBindingDescriptionSet<TabHomeView, TabHomeViewModel>(this);
        set.Bind(MorningImage).For(img => img.Image).To(res => res.MorningContent.picture).WithConversion<StringToImageConverter>();
        set.Bind(MorningJuiceName).To(vm => vm.MorningContent.name);
        set.Bind(MorningBtn)
           .To(vm => vm.NavigateToMorningJuice);

        set.Apply();
    }

在文本文件中放入随机id的函数:

public async void GetAfternoonJuice()
        {
        Recipes = await _recipeService.GetRecipes();
        int counter = Recipes.Count;

        Random rnd = new Random();
        int RandomNumber = rnd.Next(1, counter);
        string rndNumToStr = RandomNumber.ToString();
        DateTime dateAndTime = DateTime.Now;
        string day = dateAndTime.ToString("dd/MM/yyyy");
        string folderValue = (day + "," + rndNumToStr);
        var _folderName = "TextFilesFolder2";
        var _fileName = "AfternoonJuice";

        if (!_fileStore.FolderExists(_folderName))
            _fileStore.EnsureFolderExists(_folderName);

        //Content van de file uitlezen
        string value = string.Empty;
        _fileStore.TryReadTextFile(_folderName + "/" + _fileName, out (value));
        string CheckFileContent = value;
        string[] TextFileList;

        //Als er niets in zit, default data in steken
        if (CheckFileContent == null)
        {
            _fileStore.WriteFile(_folderName + "/" + _fileName, "00/00/00,0");
            string d = "00/00/00,0";
            TextFileList = d.Split(',');
        }
        else
        {
            TextFileList = CheckFileContent.Split(',');

        }


        if (TextFileList[0] != day)
        {

                //File verwijderen om overbodige data te verwijderen.
                _fileStore.DeleteFile(_folderName + "/" + _fileName);
                //File aanmaken.
                if (!_fileStore.FolderExists(_folderName))
                    _fileStore.EnsureFolderExists(_folderName);

                _fileStore.WriteFile(_folderName + "/" + _fileName, folderValue);
                string NewValue = string.Empty;
                _fileStore.TryReadTextFile(_folderName + "/" + _fileName, out (NewValue));
                string NValue = NewValue;

                List<string> NewTextFileList = new List<string>(
                NValue.Split(new string[] { "," }, StringSplitOptions.None));

                int numVall = Int32.Parse(NewTextFileList[1]);
                int NewRandomValue = numVall;
                AfternoonContent = await _recipeService.GetRecipeById(NewRandomValue);
                RaisePropertyChanged(() => AfternoonContent);

        }
        else
        {
            int numVall = Int32.Parse(TextFileList[1]);
            int NewRandomValue = numVall;
            AfternoonContent = await _recipeService.GetRecipeById(NewRandomValue);
            RaisePropertyChanged(() => AfternoonContent);
        }

    }

详细命令:

 public MvxCommand<Recipe> NavigateToAfternoonJuice
    {
        get
        {

            var _folderName = "TextFilesFolder2";
            var _fileName = "AfternoonJuice";
            string value = string.Empty;
            _fileStore.TryReadTextFile(_folderName + "/" + _fileName, out (value));
            string fV = value;

            List<string> TextFileList = new List<string>(
                fV.Split(new string[] { "," }, StringSplitOptions.None));
            int numVall = Int32.Parse(TextFileList[1]);
            int NewRandomValue = numVall;


            return new MvxCommand<Recipe>(SelectedRecipe =>
            {
                ShowViewModel<DetailJuiceListViewModel>(new { RecipeId = NewRandomValue });
            });
        }
    }

执行命令之前 public 属性 NavigateToAfternoonJuice 运行 中的一些代码。它将是 运行,当绑定发生时而不是当命令实际执行主体时。

您可能希望将命令修改为如下内容。

private MvxCommand<Recipe> _navigateToAfternoonJuice;
public MvxCommand<Recipe> NavigateToAfternoonJuice
{
    get
    {
        if (_navigateToAfternoonJuice == null)
            _navigateToAfternoonJuice = new MvxCommand<Recipe>(DoNavigateToAfternoonJuice);
        return _navigateToAfternoonJuice;
    }
}

private void DoNavigateToAfternoonJuice(Reciepe selectedRecipe)
{
    var _folderName = "TextFilesFolder2";
    var _fileName = "AfternoonJuice";
    string value = string.Empty;
    _fileStore.TryReadTextFile(_folderName + "/" + _fileName, out (value));
    string fV = value;

    List<string> TextFileList = new List<string>(
        fV.Split(new string[] { "," }, StringSplitOptions.None));
    int numVall = Int32.Parse(TextFileList[1]);
    int NewRandomValue = numVall;

    ShowViewModel<DetailJuiceListViewModel>(new { RecipeId = NewRandomValue });
}

这将使文本文件在命令执行时被读取。