当集合为空时,UWP XAML 引发未处理的异常

Mah*_*san 5 c# data-binding xaml nullpointerexception uwp

我有两个ObservableCollection<T>,它与两个不同的用户界面绑定ListView

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

ObservableCollection<Teacher> teacherList = new ObservableCollection<Teacher>();
Run Code Online (Sandbox Code Playgroud)

用户可以在运行时从集合中添加或删除项目。

在某些时候,如果任一列表为空,应用程序将冻结并引发未处理的异常{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
Run Code Online (Sandbox Code Playgroud)

异常信息

Message =“检测到布局周期。布局无法完成​​。\r\n检测到布局周期。布局无法完成​​。”

_message = "布局 GUI 时发生循环。"

这是 UI 的代码块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>

Run Code Online (Sandbox Code Playgroud)

事件的 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;
            }
        }

Run Code Online (Sandbox Code Playgroud)

需要注意的是,Teacher类派生于Department类。如果我删除一个部门,与该部门相关的所有老师也会被删除。

为了防止应用程序崩溃,我必须将硬编码的垃圾项目添加到列表中,用户可以稍后在运行时删除该项目。

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

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

Fay*_*SFT 4

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

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" Height="100">
Run Code Online (Sandbox Code Playgroud)

或者作为@Noorul 共享的链接将 VerticalScrollBarVisibility 设置为 Auto。

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" VerticalScrollBarVisibility="Auto">
Run Code Online (Sandbox Code Playgroud)