Хобрук: Ваш путь к мастерству в программировании

Почему мое поле со списком зависает при изменении источника элементов?

Шаги для воспроизведения:

Когда приложение запустится, откройте поле со списком, чтобы сгенерировать элементы. Теперь нажмите кнопку «Нажми меня!» кнопка. В приведенном ниже коде источник элементов поля со списком изменен. Теперь попробуйте снова открыть поле со списком. Поле со списком зависает не менее чем на 5 секунд, хотя в связанной коллекции находится только 2 элемента. Это всего лишь тестовое приложение. В моем реальном приложении больше 2 пунктов и лаги невыносимые. Я пробовал это с включенной и выключенной виртуализацией. Это не имеет значения.

Что так долго? Как я могу это исправить? Если нет прямого исправления, есть ли обходной путь?

XAML:

    <StackPanel>
        <ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
        <Button Content="Click Me!" Click="btn_Click"></Button>
    </StackPanel>

КОД:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    ObservableCollection<Junk> junk1 = new ObservableCollection<Junk>() {
        new Junk() { Junk1 = "jdkf", Junk2 = "fjdfkasjd;klfj" },
        new Junk() { Junk1 = "jfdk;a", Junk2 = "fjkdljf" } };

    ObservableCollection<Junk> junk2 = new ObservableCollection<Junk>() {
        new Junk() { Junk1 = "fjkdfhsdjk", Junk2 = "fdjkah;" },
        new Junk() { Junk1="", Junk2 = "asdfj" } };

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        this.cbo.ItemsSource = junk1;
    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        if (this.cbo.ItemsSource == junk1)
            this.cbo.ItemsSource = junk2;
        else
            this.cbo.ItemsSource = junk1;
        this.cbo.UpdateLayout();
    }
}

public class Junk
{
    public string Junk1 { get; set; }
    public string Junk2 { get; set; }
}

  • Есть ли у вас какие-либо другие события, которые могут запускаться при нажатии на это поле со списком (а не при его загрузке)? 24.11.2010
  • Почему вы меняете ItemsSource, а не просто меняете элементы в самой ObservableCollection? Кроме того, Junk не является производным от какого-либо представления пользовательского интерфейса, верно? Это просто стандартный класс? 24.11.2010
  • Я не могу воспроизвести эту проблему в Silverlight. 24.11.2010

Ответы:


1

myermian — никакие другие события не связаны. Это все приложение. Никакой другой код не требуется для получения поведения зависания.

Аарон — Джанк — это просто стандартный класс. Это не происходит ни от чего. Я попытался сохранить коллекцию, вызвав метод .Clear(), а затем добавив новые элементы. Я получаю точно такое же поведение.

AnthonyWJones — ошибка в WPF. Я не пробовал это в Silverlight. Извините за путаницу.

25.11.2010

2

Я точно скопировал ваш код, и он отлично работает, как и ожидалось, поэтому я предполагаю, что с вашей средой что-то не так.

Примечание. Вам не нужно вызывать this.cbo.UpdateLayout();, так как ItemsSource является свойством зависимости и будет автоматически обновлять элемент управления при изменении.

25.11.2010
  • У тебя не было заморозки? Вы сбросили поле со списком, чтобы создать контейнеры элементов, прежде чем нажали кнопку? У меня такое же поведение на двух разных машинах. Обе машины обновлены до .NET 4.0 и VS2010. 26.11.2010
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..