奇怪的silverlight事件行为

时间:2011-03-14 09:08:59

标签: c# silverlight silverlight-4.0

我是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子,然后退出,我必须再次按下它以删除另一个对象。任何人都有解释原因?

2 个答案:

答案 0 :(得分:2)

s实际上是否包含对象列表?

您选择的项目r.Id == Id并且不知道Id是什么以及它来自哪里,看起来您的代码应该只返回一个项目。

答案 1 :(得分:0)

一旦你超越了事实,你只选择一个具有匹配ID的项目,你可能会遇到另一个问题。我想如果你附加一个调试器并捕获异常,你会发现一个会被抛出:)

当您遍历它时,您正在修改集合ctrl.Children,这会破坏整个枚举模式。 (删除一个项目 - &gt;尝试移动到下一个 - &gt;“哦裤子,集合已经改变了”)

Linq查询生成您可以将其视为装饰枚举器,指向原始集合。通过调用ToList或ToArray强制s成为一个单独的集合将解决这个问题。