我如何使用位于 PostgreSQL 中的数据来填充我的页面,而不是在我的 ViewModel 中找到的硬编码 dummy/template 信息?

How can I fill up my page with data located in PostgreSQL as opposed from the hardcoded dummy/template info found in my ViewModel?

在我的应用程序中,我正在尝试练习 MVVM 格式(尽管我可能在某些地方违反了它并且我正在重构它)。我有一个 UserControl,它是一个“食谱屏幕”,显示用户应该输入的标题、注释、说明、成分和工具。该页面确实通过我的 [=21= 填充了虚拟信息] 但是,您将在下面看到;在用我的数据库中找到的实际数据填充这些位置时,我一片空白?

对于上下文,我已经使用我希望在我的食谱页面上看到的数据制作了 table 以确保所有绑定都有效,但事实是,我是一个完全的初学者并希望得到指导。

我所做的研究:我一直看到 questions/answers 关于 Entity Framework,我没有使用它,所以我不确定它对我有多重要,除非这是必需的我要这样做吗?我也尝试过从我的数据库中“读取”数据并应用它,您将在我的代码中看到这些数据 - 但我不确定我是否正确地做到了这一点。这是我的代码供参考:


public class RecipeViewModel : ViewModelBase
    {
        public ICommand NavigateHomeCommand { get; }

        public NavigationBarViewModel NavigationBarViewModel { get; }

        public Recipe CurrentRecipe { get; set; }


        // DATABASE SECTION

        public static NpgsqlConnection GetConnection()
        {
            return new NpgsqlConnection(@"Server=localhost;Port=5432;User Id=postgres;Password=abc123;Database=practiceDB;");
        }

        // Currently inactive database code that I attemped to use before, to no avail
        private void LoadData()
        {
            NpgsqlConnection con = GetConnection();
            string query = @"select * from recipes";
            NpgsqlCommand cmd = new NpgsqlCommand(query, con);
            con.Open();
            var reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                var recipe = new Recipe()
                {
                    Title = reader.GetString(reader.GetOrdinal("Title")),
                    Ingredients = reader.GetString(reader.GetOrdinal("Ingredients")),
                    Tools = reader.GetString(reader.GetOrdinal("Tools")),
                    Notes = reader.GetString(reader.GetOrdinal("Notes")),
                    Step1 = reader.GetString(reader.GetOrdinal("StepOne")),
                    Step2 = reader.GetString(reader.GetOrdinal("StepTwo")),
                    Step3 = reader.GetString(reader.GetOrdinal("StepThree")),
                    Step4 = reader.GetString(reader.GetOrdinal("StepFour")),
                    Step5 = reader.GetString(reader.GetOrdinal("StepFive")),
                    Step6 = reader.GetString(reader.GetOrdinal("StepSix")),
                };

                CurrentRecipe = recipe;
            }

            con.Close();
        }

        // Constructor with the dummy info

        public RecipeViewModel(NavigationBarViewModel navigationBarViewModel, NavigationService<HomeViewModel> homeNavigationService)
        {
            NavigationBarViewModel = navigationBarViewModel;

            NavigateHomeCommand = new NavigateCommand<HomeViewModel>(homeNavigationService);
            

            CurrentRecipe = new Recipe();
            
            CurrentRecipe.Title = "Example 1";

            CurrentRecipe.Step1 = "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";
            CurrentRecipe.Step2 = "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";
            CurrentRecipe.Step3 = "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";
            CurrentRecipe.Step4 = "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";
            CurrentRecipe.Step5 = "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";
            CurrentRecipe.Step6 = "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";

            CurrentRecipe.Ingredients = "Insert Ingredients Here" +
                "\n" +
                "\n" +
                "Insert Ingredients Here" +
                "\n" +
                "\n" +
                "Insert Ingredients Here";

            CurrentRecipe.Tools = "Insert Tools Here" +
                "\n" +
                "\n" +
                "Insert Tools Here" +
                "\n" +
                "\n" +
                "Insert Tools Here" +
                "\n" +
                "\n" +
                "Insert Tools Here";

            CurrentRecipe.Notes =
                "Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum. " +
                "Ut diam quam nulla porttitor. Semper viverra nam libero justo laoreet sit. Potenti nullam ac tortor vitae purus faucibus." +
                "Eget felis eget nunc lobortis mattis. Vel quam elementum pulvinar etiam non quam.";
        }
    }

在我的 XAML 标题部分,这是我必须让您了解我如何绑定这些的内容:


                <Label
                    Grid.Row="0"
                    Grid.Column="0"
                    Background="#1D3749"
                    HorizontalContentAlignment="Center"
                    VerticalContentAlignment="Center">
                    <Label>
                        <TextBlock
                            FontSize="35"
                            Foreground="White"
                            TextWrapping="WrapWithOverflow"
                            Grid.Row="0"
                            Grid.Column="0"
                            Text="{Binding CurrentRecipe.Title}" />
                    </Label>
                </Label>

Entity Framework 不是必需的,但它会简化大部分数据操作,因此推荐使用。核心问题是您的 LoadData() 方法似乎没有从任何地方调用,因此它永远不会执行。此外,您从数据库中读取了 所有 recipe 的配方,并用读取的后续配方覆盖每个配方。