繁体   English   中英

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

[英]UWP XAML is throwing an unhandled exception when a collection is empty

我有两个ObservableCollection<T>并且它与两个不同的ListView UI 绑定。

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 = "布置 GUI 时发生循环。"

这是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类。 如果我删除一个系,所有与该系相关的教师也会被删除。

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

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

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

这似乎是一个内部布局设计。 问题是 ScrollViewer 导致循环渲染。 您可以为 scrollViewer 设置高度。 例如:

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

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

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

你得到的错误有点模糊。 您的问题,虽然在不设置平静的情况下无法完全调试,而 c# 是此问题的一种变体。

当您的一个或另一个列表为空时,就会发生某种异常。 您是否有任何假设会返回的 linq 查询? 毕竟你访问过那个东西吗?

问题只是说 UWP 正在无限循环中尝试重建您的 UI,发生了不好的事情并重试。 这就是您的应用程序崩溃的原因。 因为无限循环。

如果您在 ListView 中使用了滚动查看器,或者当列表中没有项目时,您可以遍历您的项目。

该线程讨论相同的问题。

检测到布局周期,布局无法完成

检测到布局周期。 布局无法完成​​。 检测到布局周期。 布局无法完成

希望这可以帮助。

如果您发布您的 xaml 代码,它将有助于诊断您的问题。

谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM