首页 > 解决方案 > 选择选择器项目时显示表格信息

问题描述

我仍然是初学者,所以请耐心等待。

我正在尝试根据选择器的 selectedItem 更改显示的信息(在 ActionSheet 和其他页面上)。选择器中的每个项目都引用表上的一列,并且有自己的行 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}"/>

桌子

 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; } 

如果我term.TermName在 DisplayActionSheet 中使用 etc.,它可以工作(ish),但只会显示默认值,无论 Picker SelectedItem 是什么。如果我将 DisplayActionSheet 更改为PickerItem.TermNameetc.,则会出现错误“对象不包含 TermName 的定义”。

我知道 SelectedItem 是一个对象,但我不确定如何设置该对象以引用术语表或 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}"/>

标签: xamarindata-bindingandroid-sqlitepicker

解决方案


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());

}

推荐阅读