Avalonia怎么实现CheckBox的全选和反选 Avalonia CheckBox绑定教程

来源:这里教程网 时间:2026-02-21 17:33:48 作者:

在 Avalonia 中实现 CheckBox 的全选和反选,核心是通过数据绑定 + 命令(或属性变更通知)控制一组 CheckBox 的

IsChecked
状态。不需要写后台代码遍历控件,而是靠 MVVM 模式驱动 UI 更新。

1. 定义数据模型并支持通知

每个子项需要实现

INotifyPropertyChanged
,确保勾选状态变化能刷新 UI:

public class Item : INotifyPropertyChanged
{
    private bool _isChecked;
    public bool IsChecked
    {
        get => _isChecked;
        set => this.RaiseAndSetIfChanged(ref _isChecked, value);
    }
    public string Name { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

2. 在 ViewModel 中管理全选逻辑

维护一个主 CheckBox(全选框)的绑定属性,并监听其变化来同步所有子项;同时监听子项变化,动态更新“全选”状态:

定义
AllSelected
属性,双向绑定到全选 CheckBox 的
IsChecked
定义
Items
集合(如
ObservableCollection<item></item>
AllSelected
setter 中批量设置所有
Item.IsChecked
为每个
Item
IsChecked
变更注册回调(或用
ObservableCollection
CollectionChanged
+ 子项事件订阅),重新计算
AllSelected

3. XAML 中绑定全选 CheckBox 和列表

使用

CheckBox
绑定
AllSelected
,用
ItemsControl
DataGrid
渲染子项,每个子项内放一个绑定自身
IsChecked
的 CheckBox:

<StackPanel>
  <CheckBox Content="全选" IsChecked="{Binding AllSelected}" />
  <ItemsControl Items="{Binding Items}">
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}" />
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</StackPanel>

4. 反选只需一行逻辑(可选扩展)

加个“反选”按钮,命令执行:

foreach (var item in Items) item.IsChecked = !item.IsChecked;

然后手动触发
AllSelected
的重算(比如调用
RaisePropertyChanged(nameof(AllSelected))
),UI 就自动更新了。

基本上就这些。关键是把状态收归 ViewModel,避免操作 UI 元素,Avalonia 的绑定机制会自动处理双向同步。

相关推荐