C# Can';t通过ContextMenu从ObservableCollection中删除项

C# Can';t通过ContextMenu从ObservableCollection中删除项,c#,xaml,windows-phone-8,C#,Xaml,Windows Phone 8,我有一个名为MyClass和Location的类的程序MyClass包含Location项的ObservableCollection,并且Location包含名为Name的字符串属性。在MainPage.xaml中,我有一个LongListSelector(每个项目都有一个ContextMenu),其中填充了表示位置的网格 当我从上下文控件中单击“删除”菜单项时,它通常会删除底层的位置对象并更新视图。在填充LongListSelector并删除其所有项目的几个周期后,无法再删除添加的一些新项目

我有一个名为
MyClass
Location
的类的程序
MyClass
包含
Location
项的
ObservableCollection
,并且
Location
包含名为
Name
的字符串属性。在
MainPage.xaml
中,我有一个
LongListSelector
(每个项目都有一个
ContextMenu
),其中填充了表示
位置的网格

当我从上下文控件中单击“删除”菜单项时,它通常会删除底层的
位置
对象并更新视图。在填充
LongListSelector
并删除其所有项目的几个周期后,无法再删除添加的一些新项目

我的意思是:LLS最初包含两个项目。然后我删除这两项,再添加3项。但是,在本例中,我只能删除第三个,而不能删除前2个

这是
ContextMenu
MenuItem
单击
MainPage.xaml.cs
中的事件:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    var selectedItem = (sender as MenuItem).DataContext as Location;

    for (int i = 0; i < MyClass.Locations.Count; i++)
    {
        if (MyClass.Locations[i].Name == selectedItem.Name)
        {
            MyClass.Locations.Remove(MyClass.Locations[i]);
            break;
        }
    }
}

有任何解决此问题的建议吗?

如果您没有使用分组选项,我建议您使用列表框而不是LLS。它工作得更好,产生的问题更少。

顺便说一下,我也遇到了这个控件的问题-可能与您的类似。
奇怪的是,LLS.UpdateLayout()在ListBox中无法正常工作。

如果您不使用分组选项,我建议您使用ListBox而不是LLS。它工作得更好,产生的问题更少。

顺便说一句,我也遇到了这个控件的问题-可能与您的类似。
奇怪的是,LLS.UpdateLayout()在ListBox中无法正常工作。

我假设DataContext实际上是位置中的一个项?在这种情况下,您应该能够使用类似于
MyClass.Locations.remove(selectedItem)
的方法从集合中删除项,而不是使用for循环。我已经尝试过了,但不幸的是,我仍然遇到了相同的问题。您能详细说明
不能再删除了吗?您仍然可以打开关联菜单吗?您是否尝试在条件处设置断点以查看名称是否因任何原因不匹配?ContextMenu仍会显示。我设置了一个断点,结果显示
selectedItem
为空。@第三个-您可以尝试用ListBox替换LLS,并检查是否存在相同的问题吗?我假设DataContext实际上是来自这些位置的项?在这种情况下,您应该能够使用类似于
MyClass.Locations.remove(selectedItem)
的方法从集合中删除项,而不是使用for循环。我已经尝试过了,但不幸的是,我仍然遇到了相同的问题。您能详细说明
不能再删除了吗?您仍然可以打开关联菜单吗?您是否尝试在条件处设置断点以查看名称是否因任何原因不匹配?ContextMenu仍会显示。我设置了一个断点,结果显示
selectedItem
为空。@第三个-您能否尝试用ListBox替换LLS,并检查是否存在相同的问题?
var toRemove = MyClass.Locations.Where(x => x.Name == selectedItem.Name).SingleOrDefault();
MyClass.Locations.Remove(toRemove);