当 DataGridCheckBoxColumn 在 DataGrid 中使用并绑定到支持模型中的布尔属性时,会发生这种情况。当单击该列并且选中/取消选中复选框时——它的行为符合预期——但是当我关闭主窗口时,抛出异常。当仅使用文本列并与之交互时,不会发生这种情况。如果我根本不与复选框列交互而只是关闭窗口,它也不会发生。只有在与复选框列交互后关闭窗口时才会发生这种情况。
开发环境:
操作系统:
1. Arch Linux、Gnome 3、Wayland。
2.Windows 10 专业版
开发:
dotnet core 3.1.103
IDE:VS Code
重现步骤:
使用 DataGrid 的一般过程在教程文章中提到: Avalonia DataGrid Getting Started
我对文章所做的唯一更改是将 DataGridCheckBoxColumn 添加到 DataGrid 并将布尔值 IsChecked 属性添加到教程中使用的“Person”模型类——然后将两者绑定在一起。
所以关键步骤是:
$ dotnet new avalonia.mvvm
- 在 *csproj 文件中,将所有 Avalonia 的版本包括到 0.9.10,因为这就是我正在使用的 DataGrid 的版本。
$ dotnet add package Avalonia.Controls.DataGrid
- 在 App.xaml 中,添加样式:
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Default.xaml"/>
- 将以下属性添加到模型类“Person” --- 其余代码保持不变,并按照链接教程:
public bool IsChecked
{get;set;}
- 将 DataGridCheckBoxColumn 添加到 DataGrid 并将其绑定如下所示(其余列保持不变,按照链接教程):
<DataGrid.Columns>
<DataGridTextColumn Header="First Name"
Binding="{Binding FirstName}"
Width="2*" />
<DataGridTextColumn Header="Last Name"
Binding="{Binding LastName}"
Width="2*" />
<DataGridTextColumn Header="Department"
Binding="{Binding DepartmentNumber}"
Width="*" />
<DataGridCheckBoxColumn Header="IsChecked"
Binding="{Binding IsChecked}"
Width="*" />
</DataGrid.Columns>
- 然后,当我运行应用程序(从命令行或 vscode)时——GUI 会按预期显示——包含所有列和值——并且通常会显示额外的复选框列。__ 当我单击复选框列时——复选框确实按预期被选中和取消选中(尽管需要额外单击一次)。 但是当我通过单击右上角的“X”关闭窗口时——那是未处理的异常发生的时候——而不是在那之前。
完整的异常文本:
未处理的异常。System.InvalidOperationException:集合已修改;枚举操作可能无法执行。在 System.Collections.Generic.List`1.Enumerator.MoveNextRare() 在 Avalonia.Collections.AvaloniaList`1.Enumerator.MoveNext() 在 System.Linq.Enumerable.OfTypeIterator[TResult](IEnumerable source)+MoveNext() 在Avalonia.Visual.OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) 在 Avalonia.Input.InputElement.OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) 在 Avalonia.Controls.Control.OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) 在 Avalonia.Visual.OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) 在 Avalonia.Input.InputElement。 Avalonia.Controls.Control 的 OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e)。
Person 类的代码:
public class Person
{
public int DepartmentNumber { get; set; }
public string DeskLocation{ get; set; }
public int EmployeeNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsChecked
{get;set;}
}
MainWindowViewModel 的代码充当 MainWindow 背后的代码,并使用上面的 Person 类来托管 ObservableCollection 并将其公开为名为 People 的公共属性。DataGrid 绑定到这个作为 Person 类集合的 People 属性(谁的属性由不同的列表示,例如 DataGridTextColumn 和 DataGridCheckBoxColumn):
public class MainWindowViewModel : ViewModelBase
{
public ObservableCollection<Person> People { get; set;}
public MainWindowViewModel()
{
People = new ObservableCollection<Person>(GenerateMockPeopleTable());
}
private ObservableCollection<Person> GenerateMockPeopleTable()
{
var defaultPeople = new ObservableCollection<Person>()
{
new Person()
{
FirstName = "Pat",
LastName = "Patterson",
EmployeeNumber = 1010,
DepartmentNumber = 100,
DeskLocation = "B3F3R5T7",
IsChecked = false
},
new Person()
{
FirstName = "Jean",
LastName = "Jones",
EmployeeNumber = 973,
DepartmentNumber = 200,
DeskLocation = "B1F1R2T3",
IsChecked = true
},
new Person()
{
FirstName = "Terry",
LastName = "Tompson",
EmployeeNumber = 300,
DepartmentNumber = 100,
DeskLocation = "B3F2R10T1",
IsChecked = false
}
};
return defaultPeople;
}
}
更新:我已经放弃寻找解决方案。这是我的工作:
而不是使用 DataGridCheckBoxColumn (它还有一个额外的烦恼,即仅在单击两次时才被检查——我正在使用 DataGridTemplateColumn。它解决了上述异常问题——以及我想要的单击一次检查的属性。
<DataGridTemplateColumn Header="Select Todo">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>