Arhn - архитектура программирования

UWP XAML выдает необработанное исключение, когда коллекция пуста

У меня есть два ObservableCollection<T>, и они связаны с двумя разными ListView пользовательскими интерфейсами.

ObservableCollection<Department> deptList = new ObservableCollection<Department>();

ObservableCollection<Teacher> teacherList = new ObservableCollection<Teacher>();

Пользователь может добавлять или удалять элементы из коллекции во время выполнения.

В какой-то момент, если какой-либо из списков пуст, приложение зависает и выдает необработанное исключение {Windows.UI.Xaml.UnhandledExceptionEventArgs}

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
            UnhandledException += (sender, e) =>
            {
                if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
            };
#endif

Сообщение об исключении

Сообщение = Обнаружен цикл макета. Макет не может быть завершен.\r\nОбнаружен цикл макета. Макет не может быть завершен.

_message = Произошел цикл при размещении графического интерфейса.

Вот блок кода для ListView UI -

<ListView Header="Department List"
    x:Name="depertmentList"
    ItemsSource="{x:Bind deptList}"
    SelectionMode="Multiple"
    SelectionChanged="depertmentList_SelectionChanged">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="data:Department">
                <StackPanel Margin="1">
                    <TextBlock Text="{x:Bind Dept}" Margin="1"/>
                    <TextBlock Text="{x:Bind SemesterCount}" Margin="1"/>
                    <TextBlock Text = "{Binding Courses, Converter={StaticResource ListToStringConverter}}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
<ListView Header="Teacher List"
    x:Name="teacherListView"
    ItemsSource="{x:Bind teacherList}"
    SelectionMode="Single"
    SelectionChanged="teacherListView_SelectionChanged"
    Margin="2">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Teacher">
            <StackPanel>
                <TextBlock Text="{x:Bind Name}"/>
                <TextBlock Text="{x:Bind Designation}" Margin="1"/>
                <TextBlock Text="{x:Bind Dept}" Margin="1"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Код C# для событий

        private void depertmentList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
            if (depertmentList.SelectedItem == null)
            {
                removeDept.IsEnabled = false;
                teacherListView.ItemsSource = teacherList;
            }
            else
            {
                removeDept.IsEnabled = true;
                ObservableCollection<Department> t = new ObservableCollection<Department>();
                Department temp = (Department)depertmentList.SelectedItem;
                teacherListView.ItemsSource = from teacher in teacherList
                                              where teacher.Dept == temp.Dept
                                              select teacher;
            }
        }
        private void teacherListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (teacherListView.SelectedItem == null)
            {
                removeTeacher.IsEnabled = false;
            }
            else
            {
                removeTeacher.IsEnabled = true;
            }
        }

Следует отметить, что класс Teacher происходит от класса Department. И если я удаляю кафедру, все учителя, связанные с этой кафедрой, тоже удаляются.

Чтобы предотвратить сбой приложения, мне пришлось добавить в список жестко запрограммированный мусорный элемент, который пользователь может удалить позже во время выполнения.

И опять же, если один из списков пуст, приложение вылетает. Но если в обоих списках есть хотя бы один элемент, ничего не происходит.

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


  • Я также добавил исключение во второй блок кода. Я нашел строки из файла App.g.i.cs. 06.12.2019
  • извините, это не поможет. Наведите курсор на e в UnhandledException += (sender, e) и получите точное исключение. Это определенно помогло бы. 06.12.2019
  • Сообщение = Обнаружен цикл макета. Макет не может быть завершен.\r\nОбнаружен цикл макета. Макет не может быть завершен. 06.12.2019
  • {Windows.UI.Xaml.UnhandledExceptionEventArgs} _message = Произошел цикл при компоновке графического интерфейса. 06.12.2019
  • Надеюсь, это поможет. 06.12.2019
  • конечно, это помогает. Не могли бы вы опубликовать свой xaml и код, в котором вы назначаете коллекцию своему элементу управления xaml. 06.12.2019
  • Привет! Я добавил код XAML 06.12.2019
  • добавьте код событий selection_changed и где вы назначаете коллекцию для просмотра списка. 06.12.2019
  • Давайте продолжим это обсуждение в чате. 06.12.2019
  • Когда я протестировал ваш код и попытался удалить элементы из одной из коллекций, пока она не станет пустой, но она работала хорошо, не зависала. Вы только что очистили один из списка, и приложение разбилось? Вы делали другое поведение? Кроме того, можете ли вы предоставить простой образец, который можно воспроизвести? 06.12.2019

Ответы:


1

Похоже на внутренний дизайн макета. Проблема в том, что ScrollViewer вызывает рендеринг цикла. Вы можете установить высоту для вашего scrollViewer. Например:

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" Height="100">

или как ссылка @Noorul поделился, чтобы установить для параметра VerticalScrollBarVisibility значение Auto.

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" VerticalScrollBarVisibility="Auto">
06.12.2019
  • Ты прав. Все дело в рендеринге макета. Бесполезная катастрофа. Это уже испортило мне весь день, когда я думал о внутреннем коде. 02.07.2020

  • 2

    Ошибка, которую вы получаете, немного неясна. Ваша проблема, хотя и не совсем возможна для отладки без установки спокойствия и С#, является разновидностью этого.

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

    Проблема просто в том, что UWP пытается в бесконечном цикле восстановить ваш пользовательский интерфейс, происходит что-то плохое, и он повторяет попытку. Вот почему ваше приложение рухнуло. Из-за бесконечного цикла.

    06.12.2019
  • У меня есть операция LINQ, когда выбран элемент ListView, связанный с отделом. 06.12.2019

  • 3

    Если вы использовали scrollviewer внутри вашего ListView или вы можете перебирать свои элементы, когда в списке нет элемента.

    В этой теме обсуждается один и тот же вопрос.

    Обнаружен цикл макета, макет не может быть завершен

    Обнаружен цикл макета. Макет не может быть завершен. Обнаружен цикл компоновки. Макет не может быть завершен

    Надеюсь это поможет.

    Если вы опубликуете свой код xaml, это будет полезно для диагностики вашей проблемы.

    Спасибо.

    06.12.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..