Странное поведение Silverlight событий - PullRequest
0 голосов
/ 14 марта 2011

Я нуб в 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);
    }

Как вы можете видеть, я пытаюсь удалить несколько объектов с экрана.Дело в том, что обработчик по какой-то причине завершает работу после каждого удаления, а не удаляет их все сразу.Когда я нажимаю кнопку в первый раз, она удаляет дочернюю панель стека, затем она выходит, и мне приходится нажимать ее снова, чтобы удалить другой объект.У кого-нибудь есть объяснение, почему?

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Содержит ли s список объектов?

Вы выбираете элементы, в которых r.Id == Id и не зная, что такое Id и откуда оно, похоже, что ваш код должен возвращать толькоодин элемент.

0 голосов
/ 14 марта 2011

Как только вы откажетесь от того факта, что выбираете только один элемент с соответствующим идентификатором, у вас, вероятно, возникнет другая проблема.Я полагаю, что если вы подключите отладчик и поймаете исключения, вы обнаружите, что одно из них будет брошено:)

Вы изменяете коллекцию ctrl.Children, когда выполняете ее, что нарушает весь шаблон перечисления.(Удалите один элемент -> попробуйте перейти к следующему -> «о, штаны, коллекция изменилась»)

Запросы Linq генерируют то, что вы можете считать декорированным перечислителем, указывая на исходную коллекцию.Если заставить s быть отдельной коллекцией, вызовите ToList или ToArray, то это исправит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...