我不确定,但从我的调试时间来看,这应该是我能给出的对我的问题的最佳描述。我正在创建一个 WinRT 应用程序,有两个页面 - 主页和详细信息页面。在 Main Page 构造函数中,我初始化了一个列表框。单击列表框的任何元素时,用户将被带到详细信息页面。我只是在学习所有这些,设计可能不是最好的,但这就是我所做的。我在 MainPage.cs 中获取了一个静态变量,并将其设置为指向用户单击的元素。现在在详细信息页面的构造函数中,我使用这个静态变量来设置详细信息页面本身的数据上下文。
我期待的流程是:-
它在大多数情况下都有效,但每 5 次就会出现一次,详细信息页面构造函数会引发异常,说明静态变量尚未初始化。为什么在我启动应用程序时会运行详细信息页面的构造函数?为什么只是有时?我是否需要以其他方法而不是构造函数设置详细信息页面的 DataContext?
就问题的领域而言,代码有点复杂,而且太多,所以我避免发布它。但是,如果我无法解释问题,请告诉我,我会尽可能保持相关性发布它。
代码:- 这是单击列表框中的项目时调用的方法-将用户带到详细信息页面。
private void overviewlistbox_Tapped_1(object sender, TappedRoutedEventArgs e)
{
MatchOverview selectedmatch = (sender as ListBox).SelectedItem as MatchOverview;
matchFullDetails = new ObservableCollection<Match>();
foreach (Match m in UpdateController.matchList)
{
if (m.matchDescription == selectedmatch.matchDesc)
{
matchFullDetails.Add(m);
break;
}
}
if(!(matchFullDetails.Count == 0))
this.Frame.Navigate(typeof(Details));
}
这是主页的构造函数:-
public static ObservableCollection<Match> matchFullDetails;
public MainPage()
{
matchFullDetails = new ObservableCollection<Match>();
this.InitializeComponent();
UpdateController update = new UpdateController(); // Creating new object will update the overview_list of UpdateController(static list).
overviewlistbox.ItemsSource = UpdateController.overview_list;
}
这是详细信息页面的构造函数的代码,其中发生异常:-
public static ObservableCollection<Match> matchdetails = new ObservableCollection<Match>();
DispatcherTimer dtm_detailspage = null;
public Details()
{
this.InitializeComponent();
matchdetails = MainPage.matchFullDetails; // matchdetails.Last<>() is take because we only need item which is added latest to the collection.
if (matchdetails.Last<Match>().type == "TEST") // Exception is thrown here--Initialization
// error. When I check MainPage.matchFullDetails,
// no data is shown which means its not yet
// initialized. Also the exception is thrown either at
// the start of the app, or when details page is visited. That too once in 4-5 times, not always.
{
matchdetails.Add(matchdetails.First<Match>() as TestMatch);
}
if (matchdetails.Last<Match>().type == "ODI")
{
matchdetails.Add(matchdetails.Last<Match>() as ODIMatch);
}
if (matchdetails.Last<Match>().type == "T20")
{
matchdetails.Add(matchdetails.Last<Match>() as T20Match);
}
}
异常截图:-
遇到错误时调用堆栈数据:-
重大更新:我终于找到了漏洞。如果详细信息页面仍然处于活动状态,并且应用程序重新启动,则会出现问题。这个问题有解决办法吗??