选择选择器项目时显示 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());
}
我还是个初学者,请多多包涵。
我正在尝试根据选择器的 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());
}