代码之家  ›  专栏  ›  技术社区  ›  Ashley van Laer

沙马林。ios:Detail命令为空,因为它显示在函数之前

  •  0
  • Ashley van Laer  · 技术社区  · 6 年前

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

    问题是,Detail命令函数(按钮)的代码在存储文本文件中所有内容的函数之前运行。因此,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 回复  |  直到 6 年前
        1
  •  0
  •   Cheesebaron    6 年前

    公共属性中的一些代码 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 });
    }
    

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