Xamarin.ios:Detail命令为null,因为它显示在函数

时间:2018-05-05 11:40:53

标签: ios xamarin xamarin.ios filesystems mvvmcross

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

问题是详细命令功能(用于按钮)的代码在存储文本文件中的所有内容的函数之前运行。因此,当我按下按钮时,detail命令返回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 });
            });
        }
    }

1 个答案:

答案 0 :(得分:0)

公共属性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 });
}

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