Отображать информацию таблицы, когда выбран элемент выбора - PullRequest
0 голосов
/ 12 февраля 2020

Я все еще новичок, поэтому терпите меня.

Я пытаюсь изменить отображаемую информацию (в ActionSheet и на других страницах) в зависимости от выбранного элемента средства выбора. Каждый элемент в средстве выбора ссылается на столбец в таблице и имеет собственный идентификатор строки (установлен в 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 и c. в DisplayActionSheet он работает (i sh), но отображает только значения по умолчанию, независимо от выбранного элемента выбора. Если я изменю DisplayActionSheet на PickerItem.TermName et c., Он выдаст ошибку «объект не содержит определения для 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; } 

OnAppearing

 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}"/>

1 Ответ

1 голос
/ 12 февраля 2020

Пикер имеет свойство 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());

}
...