我如何使用位于 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
的配方,并用读取的后续配方覆盖每个配方。
在我的应用程序中,我正在尝试练习 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
的配方,并用读取的后续配方覆盖每个配方。