[英]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.