У меня есть два 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
Сообщение об исключении
Сообщение = Обнаружен цикл макета. Макет не может быть завершен.\r\nОбнаружен цикл макета. Макет не может быть завершен.
_message = Произошел цикл при размещении графического интерфейса.
Вот блок кода для 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
. И если я удаляю кафедру, все учителя, связанные с этой кафедрой, тоже удаляются.
Чтобы предотвратить сбой приложения, мне пришлось добавить в список жестко запрограммированный мусорный элемент, который пользователь может удалить позже во время выполнения.
И опять же, если один из списков пуст, приложение вылетает. Но если в обоих списках есть хотя бы один элемент, ничего не происходит.
Теперь мой вопрос: как я могу решить эту проблему, не добавляя какой-либо мусор? Я хочу предотвратить сбой, даже если списки пусты или равны нулю.