Любое использование во взломе Silverlight NotifyCollectionChangedEventArgs для поддержки нескольких элементов? - PullRequest
1 голос
/ 20 декабря 2011

Версия NotifyCollectionChangedEventArgs в Silverlight отличается от полной версии фреймворка тем, что не принимает несколько (добавленных, измененных, удаленных) элементов.Конструкторы, которые принимают списки, на самом деле отсутствуют, поэтому, похоже, Microsoft намеревалась заблокировать это использование.Действительно, если вы передадите коллекцию элементов, они просто будут вложены в качестве первого элемента внутренней коллекции.

Однако!Поскольку члены NewItems и OldItems имеют тип IList, они не являются неизменяемыми и могут быть увеличены.Я сделал следующий помощник для проверки этой идеи:

    private NotifyCollectionChangedEventArgs CreateEventArgsWithMultiple(NotifyCollectionChangedAction action, IEnumerable items, int newStartingIndex)
    {
        NotifyCollectionChangedEventArgs eventArgs = null;

        foreach (var item in items)
        {
            if (eventArgs == null)
            {
                eventArgs = new NotifyCollectionChangedEventArgs(action, item, newStartingIndex);
            }
            else
            {
                eventArgs.NewItems.Add(item);
            }
        }

        return eventArgs;
    }

Я еще не видел никаких проблем, но я ищу опыт и информацию с этим конкретным уголком Silverlight.Стоит ли мне добавлять пакетные добавления, как это, или просто использовать сброс?

Кстати, это на Windows Phone 7.1 (Mango).

Редактировать: Чтобы прокомментировать комментарийЭрно.На этой (плохо сформулированной) странице документации Silverlight на MSDN Microsoft говорит, что можно "в общем" предположить, что NewItems имеет только один элемент, и даже предлагает ярлык использования NewItems [0] для доступа к нему.Таким образом, они сохраняют сигнатуру IList для «совместимости», но затем продолжают понимать значение типа.Неудовлетворительно.

1 Ответ

1 голос
/ 20 декабря 2011

Я не сталкивался ни с какими проблемами, но ответ "Не делай этого!" (если только вы не передаете аргументы в код, который вы написали).

Причина (как было сказано в комментариях) заключается в том, что в Silverlight может быть код, который предполагает, что есть только один элемент. Даже если сегодня нет, может быть завтра, и вы определенно не хотите, чтобы ваше приложение ломалось, когда выходит какая-то новая версия Silverlight, которая в большей степени опирается на это предположение.

...