我是Silverlight和.net的菜鸟。刚刚开始玩它们,我有一个事件附加到一个行为奇怪的自定义控件。这将是处理程序代码:
private void clickCloseWindow(object sender, RoutedEventArgs e)
{
StackPanel ctrl = (StackPanel)FindName("WindowsPanel");
var s = from r in ctrl.Children.OfType<BarWindowTab>() where r.Id==Id select r;
foreach (BarWindowTab b in s)
{
ctrl.Children.Remove(b);
}
parent.Children.Remove(this);
}
正如您所见,我正在尝试从屏幕中删除多个对象。问题是,由于某种原因,处理程序在每次删除后退出,而不是一次性删除它们。当我第一次按下按钮时,它会移除stackpanel子,然后退出,我必须再次按下它以删除另一个对象。任何人都有解释原因?
答案 0 :(得分:2)
s
实际上是否包含对象列表?
您选择的项目r.Id == Id
并且不知道Id
是什么以及它来自哪里,看起来您的代码应该只返回一个项目。
答案 1 :(得分:0)
一旦你超越了事实,你只选择一个具有匹配ID的项目,你可能会遇到另一个问题。我想如果你附加一个调试器并捕获异常,你会发现一个会被抛出:)
当您遍历它时,您正在修改集合ctrl.Children,这会破坏整个枚举模式。 (删除一个项目 - &gt;尝试移动到下一个 - &gt;“哦裤子,集合已经改变了”)
Linq查询生成您可以将其视为装饰枚举器,指向原始集合。通过调用ToList或ToArray强制s成为一个单独的集合将解决这个问题。