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