Не удается ссылаться на свойства объекта после перехода на новую страницу (C#, Xamarin) - PullRequest
0 голосов
/ 14 апреля 2020

У меня проблемы со ссылками на некоторые свойства из моего объекта рецепта (который ссылается на объект InventoryItem (или ингредиент)). Во-первых, вот классы.

public class InventoryItem
{
    [PrimaryKey]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Size { get; set; }
    public string Stock { get; set; }
}

public class Recipe
{
    [PrimaryKey]
    public int ID { get; set; }
    public string Name { get; set; }

    [OneToOne]
    public InventoryItem Ingredient { get; set; }
}

Далее, это код, который создает новый рецепт и присваивает свойству Ingredient значение инвентаризации. (instanceItem уже был создан и правильно устанавливает каждое свойство для ингредиента.)

        Recipe recipe = new Recipe()
        {
            ID = (maxPK == null ? 1 : maxPK.ID + 1),
            Name = nameEntry.Text,
            Ingredient = inventoryItem
        };

Наконец, здесь я просто хотел проверить, что этот ингредиент рецепта был установлен правильно, поэтому я проверяю и recipe.Ingredient. Имя действительно всплывает правильно .

        db.Insert(recipe);
        await DisplayAlert(null, recipe.Name + " - " + recipe.Ingredient.Name + " saved!", "okay.");
        await Navigation.PopAsync();

Теперь о проблеме ... Во-первых, я отправляю выбранный / указанный рецепт в качестве ссылки, когда открываю новый ViewRecipePage. Указанный рецепт выбирается из коллекции ViewView всех рецептов.

    private async void checkRecipe_Clicked(object sender, EventArgs e)
    {
        await Navigation.PushAsync(new ViewRecipePage(recipe));
    }

Затем на ViewRecipePage я хочу просмотреть различные свойства этого рецепта, включая, конечно, ингредиент.

        try
        {
            Label recipeName = new Label();
            recipeName.Text = recipe.Name;
            grid.Children.Add(recipeName);

            Label ingredient1Name = new Label();
            ingredient1Name.Text = recipe.Ingredient.Name;
            grid.Children.Add(ingredient1Name);

        }catch(Exception e) {  DisplayAlert(null, e.ToString(), "okay."); };

Recipe.Name отображается нормально, однако всякий раз, когда я пытаюсь каким-либо образом ссылаться на recipe.Ingredient.Name, я получаю сообщение об ошибке «System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.»

Я уверен, что это что-то глупое, что я пропустил где-то по пути, но я не могу понять, почему это происходит, когда я проверял, что recipe.Ingredient.Name работает, когда я добавляю рецепт в базу данных ...

В любом случае, дайте мне знать, если есть больше информации, которую я могу предоставить! Спасибо, что посмотрели! Приветствия.

РЕДАКТИРОВАТЬ:

Новый класс рецептов с OneToMany для ингредиентов

public class Recipe
{
    [PrimaryKey]
    public int ID { get; set; }
    public string Name { get; set; }

    [OneToMany("ID")]
    public List<InventoryItem> Ingredient { get; set; }
}

Теперь при добавлении нового рецепта я создаю список для ингредиентов, а затем устанавливаю Список ингредиентов для этого нового списка ...

        inventoryItem = (InventoryItem)ingredient1Picker.SelectedItem;
        List<InventoryItem> invList = new List<InventoryItem>();
        invList.Add(inventoryItem);

        Recipe recipe = new Recipe()
        {
            ID = (maxPK == null ? 1 : maxPK.ID + 1),
            Name = nameEntry.Text,
            Ingredient = invList    
        };

Затем я вставляю в базу данных и проверяю, был ли установлен ингредиент - все это работает нормально.

        db.Insert(recipe);
        await DisplayAlert(null, recipe.Name + recipe.Ingredient[0].Name + " saved!", "okay.");

Однако, на мой «GetRecipesPage», я получаю коллекцию ViewView следующим образом:

        collectionView.ItemsSource = db.GetAllWithChildren<Recipe>().OrderBy(x => x.Name).ToList();

Однако, когда я выбираю рецепт и перехожу к ViewRecipePage и пытаюсь отобразить список ингредиентов (я просто пытаюсь увидеть первый и единственный ингредиент в списке), я получаю ошибку Индекс был вне диапазона. То, что я предполагаю, означает, что список вообще не заполняется, даже после того, как я установил в списке ингредиентов рецепта список с ингредиентом в нем и проверил его.

        try
        {
            Label recipeName = new Label();
            recipeName.Text = recipe.Name;
            grid.Children.Add(recipeName);

            Label ingredient1Name = new Label();
            ingredient1Name.Text = recipe.Ingredient[0].Name;
            grid.Children.Add(ingredient1Name);

        }catch(Exception e) {  DisplayAlert(null, e.ToString(), "okay."); };

1 Ответ

0 голосов
/ 14 апреля 2020

если вы используете расширения SQLite, вы должны быть уверены, что вы используете InsertWithChildren и GetWithChildren при работе с дочерними таблицами / объектами.

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