Skip to main content
 首页 » 编程设计

c#之当集合为空时,UWP XAML 抛出未处理的异常

2024年02月25日26落叶无声

我有两个 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 

异常消息

Message = "Layout cycle detected. Layout could not complete.\r\nLayout cycle detected. Layout could not complete."

_message = "A cycle occurred while laying out the GUI."

这是 ListView 的代码块用户界面 -

<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类(class)。如果我删除一个系,与该系关联的所有教师也将被删除。

为了防止应用程序崩溃,我不得不向列表中添加一个硬编码的垃圾项,用户可以稍后在运行时将其删除。

同样,如果其中一个列表为空,应用程序就会崩溃。但是,如果两个列表中至少有一项,则不会发生任何事情。

现在,我的问题是如何在不添加任何类型的垃圾项目的情况下解决这个问题?即使列表为空或为空,我也想防止崩溃。

请您参考如下方法:

看起来像是内部布局设计。问题是 ScrollViewer 导致循环渲染。您可以为 scrollViewer 设置高度。例如:

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

或作为 link @Noorul 分享了将 VerticalScrollBarVisibility 设置为自动。

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" VerticalScrollBarVisibility="Auto">