我有一个包含项目的LongListSelector。我制作了一个contextMenu,所以当你持有一段时间后,你会得到一个“pin to start”的选项。我没有绑定正确的项目“名称”和平铺图片的问题,但我打开正确的项目(或一般打开)有问题。
这是固定项目的代码:
private void Pin_click(object sender, RoutedEventArgs e)
{
PhoneApplicationService.Current.State["country"] = countriesList.SelectedItem;
Country selectedCountry = (sender as MenuItem).DataContext as Country;
string page = "/countryPage.xaml?id=" + countriesList.SelectedItem;
StandardTileData tileInfo = new StandardTileData
{
BackgroundImage = new Uri(selectedCountry.Flag, UriKind.Relative),
Title = selectedCountry.Name
};
ShellTile.Create(new Uri(page, UriKind.Relative), tileInfo);
}
问题出在countryPage上,因为没有数据上下文,应用程序崩溃了:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
var k = (app.MainPage.Country)PhoneApplicationService.Current.State["country"];
DataContext = k;
}
答案 0 :(得分:0)
基于您的代码的2条建议:
您的LongListSelector的itemSource是Country对象的集合吗?因为在第二页上,您尝试将状态数据类型转换为国家/地区对象。这可能是个问题。
其次,尝试使用IsolatedStorage而不是Phone State,因为State是瞬态数据,因为没有保证永远存在。
答案 1 :(得分:0)
据推测,您有一个Country
对象列表,用于填充ItemsSource
countriesList
的{{1}}。你为什么不保持在 App.xaml.cs 类公共定义的列表,并确保当应用程序使用它开始填充LongListSelector
Application_Launching()
在public static List<Country> Countries { get; set; }
个对象中,使用类似Country
的内容定义某种唯一标识符属性。
Guid
在创建Guid m_CountryID;
public Guid CountryID
{
get { return m_CountryID; }
set { m_CountryID = value; }
}
对象
Country
在Country.CountryID = new Guid()
方法中,将QueryString id参数从上方设置为Pin_click
。
CountryID
然后,在的string page = "/countryPage.xaml?id=" + selectedCountry.CountryID.ToString();
方法您的 countryPage.xaml.cs 强>拉OnNavigatedTo
从查询字符串的id参数来检索给定的Guid
对象
Country
现在您已经选择了protected override void OnNavigatedTo(NavigationEventArgs e)
{
string countryID = string.Empty;
NavigationContext.QueryString.TryGetValue("id", out countryID);
System.Diagnostics.Debug.WriteLine(string.Concat("URI: ", e.Uri.ToString(), " | CountryID: ", countryID));
if (!string.IsNullOrWhiteSpace(countryID))
{
Guid countryGuid = new Guid();
Guid.TryParse(countryID, out countryGuid);
Country country = App.Countries.Where(x => x.CountryID == countryGuid).Select(x => x).FirstOrDefault();
if (country != null)
{
// ***** BUILD YOUR PAGE AS NEEDED HERE *****
// TextBlock1.Text = country.Name;
}
}
}
对象,只需使用其中的信息构建您认为合适的页面。
当然,所有这些都假定您在应用程序会话之间维护您的国家/地区列表的状态。通常,您只需将列表写入隔离存储中的XML文件即可。 GeekChamp有很多文章可以帮助您启动和运行隔离存储。 http://www.geekchamp.com/tips/all-about-wp7-isolated-storage---read-and-save-xml-files
虽然,你可以这样做,而不必担心孤立的存储。只需使用固定Country
值(Guid
)时,创建您的not new Guid()
列表中的Country
对象,或者选择一个整数类型,始终确保相同的整数值与关联每次应用程序启动时重建它时每个Countries
。