我今天花了很多时间试图解决为什么我会得到这个例外。我有一个Listbox绑定到我的应用程序中的List。这是代码:
XAML:
<ListBox x:Name="SavePanel"
ItemsSource="{Binding}"
Background="{StaticResource PhoneBackgroundBrush}" Visibility="Visible" SelectionChanged="SavePanel_SelectionChanged" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Margin="20,5,5,5" Text="{Binding}" FontSize="43"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
C#:
List<string> saveNames;
public SaveProject()
{
InitializeComponent();
populateList();
SavePanel.DataContext = saveNames;
}
private void populateList()
{
if (settings.Contains("saveNames")) //if there are previous saves, pull the names from localstorage
{
string test = settings["saveNames"] as string;
string[] tempArray = test.Split(',');
totalSaves = tempArray.Length;
saveNames.Clear(); // clear list
for (int i = 0; i < totalSaves; i++)
{
saveNames.Add(tempArray[i]); // populate list
}
}
}
快速解释&#34; populateList&#34;:if&#34; saveNames&#34;在localstorage中存在(由逗号分隔的名称列表),该函数将其拆分为一个数组,然后将每个名称添加到List中,而List又进入ListBox。这很好用。
我也没有问题在列表中显示,添加或删除项目。问题是在ListBox中更新它;想要从List&#34; saveNames&#34;中删除一个项目,然后使用新值更新ListBox。我目前在应用程序栏上有一个应该执行此操作的按钮。我已从事件中删除了所有其他代码,并将其缩小到只是尝试使ListBox无效,然后再次添加数据上下文而不进行任何更改;我认为这会起作用,我可以从那里向上移动,找出我的代码中出错的地方。所以现在是应用程序栏事件的代码:
private void DeleteProject_Click(object sender, EventArgs e)
{
SavePanel.DataContext = null;
SavePanel.DataContext = saveNames;
}
我运行我的代码,一切正常,直到我点击&#34;删除&#34;按钮。 VS打破我得到:
A first chance exception of type 'System.NullReferenceException'
这让我难过;我甚至没有改变名单!很明显,异常是因为SavePanel.DataContext = null行。我不知道我在这里做错了什么。
非常感谢任何帮助!
private void SavePanel_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lb = (sender as ListBox);
theFileName = lb.SelectedItem.ToString();
// repopulate appbar to show delete and save buttons
for (int i = ApplicationBar.Buttons.Count - 1; i >= 0; i--)
{
ApplicationBar.Buttons.RemoveAt(i);
}
if (totalSaves < 10)
{
ApplicationBarIconButton button1 = new ApplicationBarIconButton();
button1.IconUri = new Uri("/Assets/Icons/add.png", UriKind.Relative);
button1.Text = "Add";
ApplicationBar.Buttons.Add(button1);
button1.Click += new EventHandler(AddProject_Click);
}
ApplicationBarIconButton button2 = new ApplicationBarIconButton();
button2.IconUri = new Uri("/Assets/Icons/delete.png", UriKind.Relative);
button2.Text = "Delete";
ApplicationBar.Buttons.Add(button2);
button2.Click += new EventHandler(DeleteProject_Click);
ApplicationBarIconButton button3 = new ApplicationBarIconButton();
button3.IconUri = new Uri("/Assets/Icons/save.png", UriKind.Relative);
button3.Text = "Save";
ApplicationBar.Buttons.Add(button3);
button3.Click += new EventHandler(SaveProject_Click);
}
selectionchanged处理程序只是将值存储在一个名为&#34; theFileName&#34 ;;的字符串中。此处还有一些appbar按钮的操作。
答案 0 :(得分:0)
问题是,如果您在列表框中选择了一个项目,则单击“删除”按钮。 {1}}事件将在
行后立即触发SelectionChanged
这是因为当您清除SavePanel.DataContext = null;
并提升事件时,您的SavePanel
选定索引已更改为-1。这导致Datacontext
。有几种方法可以绕过这个。一个建议是在NullReferenceException
事件中检查SavePanel.DataContext
。在事件开始时添加此代码
SelectionChanged