选择选择器项目时显示 Table 信息

Display Table info when picker item is selected

我还是个初学者,请多多包涵。

我正在尝试根据选择器的 selectedItem 更改显示的信息(在 ActionSheet 和其他页面上)。选择器中的每个项目都引用 table 上的一列,并有自己的行 ID(设置为 autoIncrement)。 我能够保存(并根据需要显示)当前的 SelectedItem,但只能作为该项目的名称,并且没有其他与该行关联的内容(我知道)。

我应该可以使用选择器的绑定属性来执行此操作,但它并不想工作。 我觉得我错过了一些愚蠢的东西。

Xaml.cs

using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation))
            {

                var terms = conn.Table<Terms>().ToList().FirstOrDefault();//Lets me access the columns on the table

                var pickerItem = termPicker.Items[termPicker.SelectedIndex]; //Lets me save and use the TermName

                DisplayActionSheet(PickerItem.TermName, "Ok", null, "Term Status: " + PickerItem.TermStatus,
               "Projected Start: " + PickerItem.TProjStart.ToString(),
               "Projected End: " + PickerItem.TProjEnd.ToString(),
               "Actual Start: " + PickerItem.TActStart.ToString(),
               "Actual End : " + PickerItem.TActEnd.ToString()); ;


            }

Xaml

<Picker x:Name="termPicker"
                    ItemsSource="{Binding Terms}"
                    ItemDisplayBinding="{Binding TermName}"
                    Title="Select a term"
                    IsEnabled="True"
                    SelectedItem="{Binding PickerItem}"/>

Table

 public class Terms
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string TermName { get; set; } 
        public string TermStatus { get; set; } 
        public DateTime TProjStart { get; set; }
        public DateTime TProjEnd { get; set; } 
        public DateTime TActStart { get; set; } 
        public DateTime TActEnd { get; set; } 
        public Object PickerItem { get; set; } 

如果我在 DisplayActionSheet 中使用 term.TermName 等,它可以工作(差不多)但只会显示默认值,而不管 Picker SelectedItem。如果我将 DisplayActionSheet 更改为 PickerItem.TermName 等,它会给出错误 "object does not contain a definition for TermName".

我知道 SelectedItem 是一个对象,但我不确定如何设置该对象以引用条款 table 或 SelectedItem 绑定到的行。

如有任何帮助,我们将不胜感激。谢谢!

编辑:添加最新的工作代码:

 public class Terms
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string TermName { get; set; } 
        public string TermStatus { get; set; } 
        public DateTime TProjStart { get; set; }
        public DateTime TProjEnd { get; set; } 
        public DateTime TActStart { get; set; } 
        public DateTime TActEnd { get; set; } 

出现

 protected override void OnAppearing()
        {
            base.OnAppearing();

            using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation))
            {
                conn.CreateTable<Terms>();
                conn.CreateTable<Courses>();
                conn.CreateTable<Assessments>();

                var terms = conn.Table<Terms>().ToList();
                var courses = conn.Table<Courses>().ToList();
                var assessments = conn.Table<Assessments>().ToList();

                termPicker.ItemsSource = terms;


                var dateNow = DateTime.Now;
                if (!terms.Any())
                {
                    conn.Insert(new Terms
                    {
                        TermName = "Demo Term",
                        TermStatus = "In Progress",
                        TProjStart = dateNow,
                        TProjEnd = dateNow,
                        TActStart = dateNow,
                        TActEnd = dateNow
                    });
                }

事件处理程序

            void InfoClicked(Object sender, EventArgs e)

            {
                using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation))
                {

                    var terms = conn.Table<Terms>().ToList().FirstOrDefault();

                    var pickerItem = termPicker.Items[termPicker.SelectedIndex];

                    DisplayActionSheet(pickerItem, "Ok", null, "Term Status: " + terms.TermStatus,
                    "Projected Start: " + terms.TProjStart.ToString(),
                    "Projected End: " + terms.TProjEnd.ToString(),
                    "Actual Start: " + terms.TActStart.ToString(),
                    "Actual End : " + terms.TActEnd.ToString());


                }

            }

选择器绑定

        <StackLayout>

            <Picker x:Name="termPicker"
                    ItemsSource="{Binding Terms}"
                    ItemDisplayBinding="{Binding TermName}"
                    Title="Select a term"
                    IsEnabled="True"
                    SelectedItem="{Binding pickerItem}"/>

一个 Picker 上有一个 SelectedItem 属性,您需要做的就是将其转换为正确的类型。然后您可以访问 term

上的所有单独属性
void InfoClicked(Object sender, EventArgs e)
{
  var term = (Terms)termPicker.SelectedItem;

  DisplayActionSheet(term.TermName, "Ok", null, "Term Status: " +  term.TermStatus,
                "Projected Start: " + term.TProjStart.ToString(),
                "Projected End: " + term.TProjEnd.ToString(),
                "Actual Start: " + term.TActStart.ToString(),
                "Actual End : " + term.TActEnd.ToString());

}