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类。如果我删除一个部门,与该部门相关的所有老师也会被删除。
为了防止应用程序崩溃,我必须将硬编码的垃圾项目添加到列表中,用户可以稍后在运行时删除该项目。
同样,如果其中一个列表为空,应用程序就会崩溃。但如果两个列表中至少有一项,则不会发生任何情况。
现在,我的问题是如何在不添加任何类型的垃圾项目的情况下解决此问题?即使列表为空或为空,我也想防止崩溃。
看起来像是内部布局设计。问题是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)
| 归档时间: |
|
| 查看次数: |
2362 次 |
| 最近记录: |