[英]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,发生了不好的事情并重试。 这就是您的应用程序崩溃的原因。 因为无限循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.