我正在尝试弄清楚如何在页面出现时加载选择器。
ClassEditPage有Instructor_Picker(如下所示)。我知道填充它的代码可以工作,因为它提供了调试输出(如下所示),但是,我的选择器从未被填充。没有错误,只是一个空白选择器。
您能帮我弄清楚当我的 ClassEditPage 出现时如何填充 Instructor_Picker 吗?
ClassEditPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Studio_Sign_In_202307.Pages.ClassEditPage"
Title="ClassEditPage">
<StackLayout Padding="20">
<!--<Label Text="Instructor:" />
<Entry Text="{Binding cInstructor}" />-->
<!-- Instructor Picker -->
<Label Text="Instructor:" />
<Picker x:Name="Instructor_Picker"
Title="Select an Instructor"
ItemsSource="{Binding InstructorsList}"
SelectedItem="{Binding SelectedInstructor}"
SelectedIndexChanged="Instructor_Picker_SelectedIndexChanged">
<Picker.ItemDisplayBinding>
<!-- Display the instructor's full name in the picker -->
<Binding Path="iFullName" />
</Picker.ItemDisplayBinding>
</Picker>
<Button Text="Submit" Clicked="OnSubmitClicked" />
<Button Text="Delete" Clicked="OnDeleteClicked" IsVisible="{Binding cID, Converter={StaticResource HasValueConverter}}" />
<Button Text="Cancel" Clicked="OnCancelClicked" />
</StackLayout>
</ContentPage>
ClassEditPage.xaml.cs
using Studio_Sign_In_202307.Data;
using Studio_Sign_In_202307.Models;
using System.Collections.ObjectModel;
using System.Diagnostics;
namespace Studio_Sign_In_202307.Pages;
public partial class ClassEditPage : ContentPage
{
private readonly Class selectedClass;
private readonly bool isNewClass;
// Property to hold the collection of instructors
public ObservableCollection<Instructor> InstructorsList { get; set; }
// Property to hold the selected instructor
public Instructor SelectedInstructor { get; set; }
public ClassEditPage(Class selectedClass)
{
InitializeComponent();
// Determine if this is an existing class or a new class
isNewClass = selectedClass == null;
this.selectedClass = selectedClass ?? new Class();
BindingContext = this.selectedClass;
// Create Connection String
string connectionString = DatabaseHelper.BuildConnectionString();
// Set the InstructorsList with the data from the database
InstructorsList = DatabaseHelper.GetInstructorsAll(connectionString);
// Debug instructor list <-- This Displays My Instructors
foreach (Instructor instructor in InstructorsList)
{
Debug.WriteLine($"Instructor ID: {instructor.iID}");
Debug.WriteLine($"Full Name: {instructor.iFullName}");
Debug.WriteLine($"Email: {instructor.iEmail}");
Debug.WriteLine("------------------------");
}
// Set the selected instructor for the class (if it has one)
if (selectedClass.iID_Link != 0)
{
SelectedInstructor = InstructorsList.FirstOrDefault(i => i.iID == selectedClass.iID_Link);
Instructor_Picker.SelectedIndex = InstructorsList.IndexOf(SelectedInstructor);
}
}
private void Instructor_Picker_SelectedIndexChanged(object sender, EventArgs e)
{
if (Instructor_Picker.SelectedItem is Instructor selectedInstructor)
{
SelectedInstructor = selectedInstructor;
}
}
private void OnSubmitClicked(object sender, EventArgs e)
{
Debug.WriteLine("SUBMIT");
// Submit Logic Here
Navigation.PopModalAsync();
}
private void OnDeleteClicked(object sender, EventArgs e)
{
Debug.WriteLine("DELETE");
// Delete Logic Here
Navigation.PopModalAsync();
}
private void OnCancelClicked(object sender, EventArgs e)
{
Navigation.PopModalAsync();
}
}
调试输出
Instructor ID: 44
Full Name: Lori
Email: [email protected]
------------------------
Instructor ID: 38
Full Name: Bret
Email: [email protected]
------------------------
Instructor ID: 56
Full Name: Jessica
Email: [email protected]
------------------------
感谢您的帮助!
我需要将“InstructorsList”和“SelectedInstructor”属性直接添加到类模型中,如下所示:
public ObservableCollection<Instructor> InstructorsList { get; set; }
public Instructor SelectedInstructor { get; set; }
我在 ClassEditPage.xaml.cs 中消除了这两个本地初始化:
public ObservableCollection<Instructor> InstructorsList { get; set; }
public Instructor SelectedInstructor { get; set; }
然后我将它们填充到 ClassEditPage 构造函数中,如下所示:
this.selectedClass.InstructorsList = new ObservableCollection<Instructor>(DatabaseHelper.GetInstructorsAll(connectionString));
...
this.selectedClass.SelectedInstructor = this.selectedClass.InstructorsList.FirstOrDefault(i => i.iID == selectedClass.iID_Link);