Xamarin.ios: команда Detail пуста, потому что она показывает перед функцией - PullRequest
0 голосов
/ 05 мая 2018

Я создаю приложение для iOS с Xamarin.ios MvvmCross. И у меня есть функция, которая помещает случайный идентификатор в текстовый файл каждый день. Итак, я получаю рецепт дня.

Проблема в том, что код для функции команды Detail (для кнопки) запускается перед функцией, которая сохраняет все в текстовом файле. Таким образом, команда detail возвращает ноль, и ничего не происходит, когда я нажимаю кнопку. Во второй раз, когда я запускаю код, он делает то, что должен, потому что в текстовом файле уже есть идентификатор.

Вид:

 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();
    }

Функция для помещения случайного идентификатора в текстовый файл:

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 голосов
/ 05 мая 2018

Часть кода в вашей общедоступной собственности 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 });
}

Это сделает текстовый файл для чтения при выполнении команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...