我正在尝试使用数据库(sqlite)技术创建Windows Phone 8项目
我尝试了以下方法:
1)从服务器下载sqlite fie并将其保存在本地应用程序中
2)我还可以从本地sqlite数据库中检索值,并通过使用此链接和其他一些链接中的一些示例代码显示在消息框中。
但是,我无法在列表框中绑定该值。
这是我的代码:
XAML 代码 :
<Grid x:Name="ContentPanel" Grid.RowSpan="2">
<ListBox Name="scheduleListbox" Margin="5,85,5,60" ItemsSource="{Binding}" SelectionChanged="scheduleListbox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="250" Width="480">
<Grid.RowDefinitions>
<RowDefinition Height="20"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Name="team1Name" Text="{Binding team1_name}" Grid.Row="0"></TextBlock>
<TextBlock Name="team2Name" Text="{Binding team2_name}"></TextBlock>
<TextBlock Name="venue" Text="{Binding venue}" ></TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<toolkit:ListPicker Name="selectTeam" Height="60" ItemsSource="{Binding}" VerticalAlignment="Bottom" Background="Black" FullModeHeader="Select your Team Schedule" Foreground="White" ExpansionMode="FullScreenOnly" Margin="5,0" SelectionChanged="selectTeam_SelectionChanged">
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<StackPanel Name="listpickerStackpannel" >
<TextBlock Text="{Binding}" TextAlignment="Center" FontFamily="Times New Roman" FontSize="30"></TextBlock>
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<StackPanel Name="listpickerStackpannel" Margin="10">
<TextBlock Text="{Binding}" TextAlignment="Center" FontFamily="Times New Roman" FontSize="30"></TextBlock>
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
</Grid>
我的CS代码是:
string DB_PATH = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sample.sqlite");
//SQLite connection
private SQLiteConnection dbConn;
private List<string> _source = new List<string>
{
"Full Schedule","Afghanistan","Australia","Bangladesh","England","Hong Kong","India","Ireland","Nepal","Netherlands","New Zealand","Pakistan","South Africa","Sri Lanka","UAE","West Indies","Zimbabwe"
};
public MainPage1()
{
InitializeComponent();
selectTeam.ItemsSource = _source;
}
private void scheduleListbox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
dbConn = new SQLiteConnection(DB_PATH);
/// Create the table Task, if it doesn't exist.
dbConn.CreateTable<iccworldt20_schedule>();
/// Retrieve the task list from the database.
List<iccworldt20_schedule> retrievedTasks = dbConn.Query<iccworldt20_schedule>("select * from iccworldt20_schedule").ToList<iccworldt20_schedule>();
/// Clear the list box that will show all the tasks.
scheduleListbox.Items.Clear();
foreach (var t in retrievedTasks)
{
MessageBox.Show(t.ToString());
}
}
}
public class iccworldt20_schedule
{
[PrimaryKey, AutoIncrement]
public int match_id { get; set; }
public string team1_Name { get; set; }
public string team2_Name { get; set; }
public string match_no { get; set; }
public string group { get; set; }
public string venue { get; set; }
public string time { get; set; }
public string day { get; set; }
public override string ToString()
{
return team1_Name + ":" + team2_Name +venue;
}
}
请给出一些解决方案,如何从sqlite DB中检索值并将其值绑定到列表框。
我看不到任何将数据添加到列表框的代码。如果从数据库中提取了数据,请将其添加到 ItemsSource 属性中即可。
scheduleListbox.ItemsSource = retrievedTasks;
我不明白为什么当你在构造函数中填写它时,你在选择团队列表选择器上使用 ItemsSource="{Binding}"。以及为什么使用相同的来调度列表框。请参阅绑定概述
如果您使用空绑定语法:{绑定}。列表框从父元素继承数据上下文。如果未指定路径,则默认绑定到整个对象。
我明白了,根据"Jan Smuda"的回复,我找到了解决方案.,
我删除了列表选择器和列表框的 XAML 代码中的绑定语法(ItemsSource="{Binding}"),并在代码本身中添加了 itemsSource。
所以我的 XAML 代码是这样的:
<ListBox Name="scheduleListbox" Margin="5,85,5,60" >
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="100" Width="480" Margin="0,0,0,5" Background="CadetBlue">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Text="{Binding team1_Name}" Name="team1Name" Foreground="White"></TextBlock>
<TextBlock Grid.Row="1" Text="{Binding team2_Name}" Name="team2Name" Foreground="Red"></TextBlock>
<TextBlock Grid.Row="2" Text="{Binding venue}" Name="venue" Foreground="Yellow"></TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<toolkit:ListPicker Name="selectTeam" Height="60" VerticalAlignment="Bottom" Background="Black" FullModeHeader="Select your Team Schedule" Foreground="White" ExpansionMode="FullScreenOnly" Margin="5,0" SelectionChanged="selectTeam_SelectionChanged">
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<StackPanel Name="listpickerStackpannel" >
<TextBlock Text="{Binding}" TextAlignment="Center" FontFamily="Times New Roman" FontSize="30"></TextBlock>
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<StackPanel Name="listpickerStackpannel" Margin="10">
<TextBlock Text="{Binding}" TextAlignment="Center" FontFamily="Times New Roman" FontSize="30"></TextBlock>
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
和我的CS代码是这样的:
string country = "Full Schedule";
List<match_schedule> ScheduleList;
// the local folder DB path
string DB_PATH = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sample.sqlite");
//SQLite connection
private SQLiteConnection dbConn;
ProgressIndicator _progressIndicator = new ProgressIndicator();
private List<string> _source = new List<string>
{
"Full Schedule","Afghanistan","Australia","Bangladesh","England","Hong Kong","India","Ireland","Nepal","Netherlands","New Zealand","Pakistan","South Africa","Sri Lanka","UAE","West Indies","Zimbabwe"
};
public Schedule()
{
InitializeComponent();
selectTeam.ItemsSource = _source;
Loaded += Schedule_Loaded;
}
void Schedule_Loaded(object sender, RoutedEventArgs e)
{
}
private void selectTeam_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
country = (sender as ListPicker).SelectedItem.ToString();
dbConn = new SQLiteConnection(DB_PATH);
/// Create the table Task, if it doesn't exist.
dbConn.CreateTable<match_schedule>();
if (country == "Full Schedule")
{
ScheduleList = dbConn.Query<match_schedule>("select * from tableName").ToList<match_schedule>();
}
else
{
ScheduleList = dbConn.Query<match_schedule>("select * from tableName where team1_Name=? or team2_Name=?", country).ToList<match_schedule>();
}
scheduleListbox.ItemsSource = ScheduleList;
}
}
public class match_schedule
{
[PrimaryKey, AutoIncrement]
public int match_id { get; set; }
public string team1_Name { get; set; }
public string team2_Name { get; set; }
public string match_no { get; set; }
public string group { get; set; }
public string venue { get; set; }
public string time { get; set; }
public string day { get; set; }
}
最后,我必须从本地SQLite数据库中检索列值并将其绑定到列表框中。
非常感谢 jan Smuda 回复我,也感谢堆栈溢出。