尝试使Listbox.DataContext无效时出现System.NullReferenceException - windows phone

时间:2014-01-04 07:09:22

标签: c# windows-phone-8 listbox nullreferenceexception datacontext

我今天花了很多时间试图解决为什么我会得到这个例外。我有一个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按钮的操作。

1 个答案:

答案 0 :(得分:0)

问题是,如果您在列表框中选择了一个项目,则单击“删除”按钮。 {1}}事件将在

行后立即触发
SelectionChanged

这是因为当您清除SavePanel.DataContext = null; 并提升事件时,您的SavePanel选定索引已更改为-1。这导致Datacontext。有几种方法可以绕过这个。一个建议是在NullReferenceException事件中检查SavePanel.DataContext。在事件开始时添加此代码

SelectionChanged