【问题标题】:Can't remove item from ObservableCollection through ContextMenu无法通过 ContextMenu 从 ObservableCollection 中删除项目
【发布时间】:2013-12-01 14:26:49
【问题描述】:

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

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

这是我的意思的一个例子:LLS 最初包含 2 个项目。然后我删除这 2 个项目并添加 3 个。但是,在这种情况下,我只能删除第三个,但不能删除第一个。

这是来自MainPage.xaml.csContextMenuMenuItem点击事件:

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;
        }
    }
}

在使用 for 循环之前,我使用了这个 LINQ 代码,但仍然遇到同样的问题:

var toRemove = MyClass.Locations.Where(x => x.Name == selectedItem.Name).SingleOrDefault();
MyClass.Locations.Remove(toRemove);

有解决这个问题的建议吗?

【问题讨论】:

  • 我假设 DataContext 实际上是 Locations 中的一个项目?在这种情况下,您应该能够使用 MyClass.Locations.Remove(selectedItem) 之类的东西从集合中删除项目,而不是 for 循环。
  • 我已经尝试过了,但不幸的是,我仍然遇到了同样的问题。
  • 你能详细说明can't be removed anymore吗?您仍然可以打开上下文菜单吗?您是否尝试在条件处设置断点以查看名称是否由于某种原因不匹配?
  • 上下文菜单仍然出现。我设置了一个断点,结果selectedItem 为空。
  • @pcnThird - 你可以尝试用 ListBox 替换 LLS 并检查你是否有同样的问题?

标签: c# xaml windows-phone-8


【解决方案1】:

如果您不使用分组选项,我建议您使用 ListBox 而不是 LLS。它工作得更好,导致的问题更少。
顺便说一句,我也遇到了 some 这个控件的问题 - 可能与你的类似。
奇怪的是 LLS.UpdateLayout() 在 ListBox 中完美运行时不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 2012-07-30
    相关资源
    最近更新 更多