在 Avalonia 中,
ListBox默认支持多选,但要实现**数据绑定驱动的多选行为**(比如绑定到 ViewModel 中的集合、响应选中项变化、支持 Ctrl/Shift 多选等),需要正确配置
SelectionMode、绑定
SelectedItems,并确保数据模型可比较(通常需实现
IEquatable<t></t>或保证引用/值一致)。
1. 设置 ListBox 的 SelectionMode 为 Multiple 或 Extended
SelectionMode决定用户如何选择多个项: Multiple:点击切换单个项,不支持 Shift/Ctrl 连续或批量选择(适合纯点击切换) Extended(推荐):默认行为,支持鼠标单击 + Ctrl(离散多选)、Shift(范围多选)、Ctrl+A 全选
在 XAML 中设置:
<ListBox Items="{Binding Items}"
SelectedItems="{Binding SelectedItems}"
SelectionMode="Extended" />
2. 绑定 SelectedItems 到 ViewModel 的可观察集合
SelectedItems是
IList类型,建议在 ViewModel 中使用
ObservableCollection<t></t>或
ReadOnlyObservableCollection<t></t>,并启用双向绑定(
Mode=TwoWay):
public ObservableCollection<Person> SelectedItems { get; } = new();
注意:不要用 new List<t>()</t>
或只读集合赋值覆盖,否则会断开绑定。Avalonia 会自动同步 UI 与该集合的增删。
3. 确保数据项可正确识别(避免重复/丢失选中状态)
如果
Items是自定义对象(如
Person),Avalonia 依赖
Equals和
GetHashCode判断是否为同一项。若未重写,引用不同即视为不同项,导致多选失效。
推荐做法:
让模型实现IEquatable<t></t>,并重写
Equals和
GetHashCode(基于 ID 或关键属性) 或确保绑定的数据源中每个项是同一实例(例如从同一个
ObservableCollection添加,不新建副本)
4. 可选:监听选中变化或手动控制
如需在选中项变更时执行逻辑,可在 ViewModel 中监听集合变化:
SelectedItems.CollectionChanged += (s, e) =>
{
// e.Action == Add/Remove/Reset...
Console.WriteLine($"当前选中 {SelectedItems.Count} 项");
};
或在 View 层用事件(不推荐,破坏 MVVM):
<ListBox SelectionChanged="OnSelectionChanged" />
不复杂但容易忽略的是:绑定目标必须是可变集合且项具备稳定标识。只要
SelectionMode设对、
SelectedItems是活的集合、数据项能被正确比较,多选绑定就自然生效。
