15 KiB
ComboBox 使用文档
本文档介绍 AtomUI ComboBox 控件的各种使用方式,示例代码摘自 Gallery 演示程序。
📖 Gallery 源码位置:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml
前置准备
在 AXAML 中使用 ComboBox,需要引入以下命名空间:
xmlns:atom="https://atomui.net"
xmlns:antdicons="https://atomui.net/icons/antdesign"
在 C# 代码中引入:
using AtomUI.Desktop.Controls; // ComboBox, ComboBoxItem 控件
using AtomUI.Controls; // SizeType, InputControlStyleVariant 等共享类型
1. 基本用法
最简单的 ComboBox 使用方式——直接在 AXAML 中声明 ComboBoxItem 子项:
<atom:ComboBox PlaceholderText="Please select" Width="300">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
2. 通过 ItemsSource + ItemTemplate 绑定数据
当选项来自 ViewModel 数据源时,使用 ItemsSource 绑定集合,ItemTemplate 定义选项模板:
<atom:ComboBox Name="TplComboBox"
PlaceholderText="Please select" Width="300"
ItemsSource="{Binding ComboBoxItems}">
<atom:ComboBox.ItemTemplate>
<DataTemplate>
<atom:TextBlock Text="{Binding Text}" VerticalAlignment="Center"/>
</DataTemplate>
</atom:ComboBox.ItemTemplate>
</atom:ComboBox>
// ViewModel
public class ComboBoxViewModel : ReactiveObject
{
private List<ComboBoxItemData>? _comboBoxItems = [];
public List<ComboBoxItemData>? ComboBoxItems
{
get => _comboBoxItems;
set => this.RaiseAndSetIfChanged(ref _comboBoxItems, value);
}
}
public class ComboBoxItemData
{
public string Text { get; set; } = string.Empty;
}
// Code-behind:初始化数据
private void InitComboBoxItems(ComboBoxViewModel viewModel)
{
var items = new List<ComboBoxItemData>
{
new() { Text = "床前明月光" },
new() { Text = "疑是地上霜" },
new() { Text = "举头望明月" },
new() { Text = "低头思故乡" },
};
viewModel.ComboBoxItems = items;
}
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml中 "Generate ComboBoxItem by ItemsSource" 示例。
3. 禁用状态
通过 IsEnabled="False" 禁用 ComboBox:
<atom:ComboBox PlaceholderText="Please select" Width="300" IsEnabled="False">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
4. 三种尺寸
通过 SizeType 属性设置尺寸,支持 Large(40px)、Middle(32px,默认)、Small(24px)三种。
<StackPanel Orientation="Vertical" Spacing="10">
<atom:ComboBox SizeType="Large" PlaceholderText="Please select">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox SizeType="Middle" PlaceholderText="Please select">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox SizeType="Small" PlaceholderText="Please select">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
</StackPanel>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml中 "Three sizes of Input" 示例。
5. 样式变体
通过 StyleVariant 属性切换视觉风格,支持 Outline(默认)、Filled、Borderless 三种。
<StackPanel Orientation="Vertical" Spacing="10">
<atom:ComboBox StyleVariant="Outline" PlaceholderText="Please select" Width="300">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox StyleVariant="Filled" PlaceholderText="Please select" Width="300">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox StyleVariant="Borderless" PlaceholderText="Please select" Width="300">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
</StackPanel>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml中 "Variants" 示例。
6. 前置/后置标签(AddOn)
通过 LeftAddOn 和 RightAddOn 在 ComboBox 外部添加附加区域,常用于协议前缀或域名后缀:
<StackPanel Orientation="Vertical" Spacing="10">
<!-- 文本前后置 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
LeftAddOn="http://"
RightAddOn=".com">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<!-- 图标后置 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
RightAddOn="{antdicons:AntDesignIconProvider Kind=SettingOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<!-- 混合:外部前置 + 内部后缀 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
LeftAddOn="http://"
ContentRightAddOn=".com">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
</StackPanel>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml中 "Pre / Post tab" 示例。
7. 内部前缀/后缀(Content AddOn)
通过 ContentLeftAddOn 和 ContentRightAddOn 在内容区域内部添加图标或辅助文本:
<StackPanel Orientation="Vertical" Spacing="10">
<!-- 图标前缀 + 图标后缀 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=UserOutlined, FillBrush=#D7D7D7}"
ContentRightAddOn="{antdicons:AntDesignIconProvider Kind=InfoCircleOutlined, FillBrush=#8C8C8C}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<!-- 文本前缀 + 文本后缀(货币场景) -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
ContentLeftAddOn="¥"
ContentRightAddOn="RMB">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
<!-- 带前后缀的禁用状态 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
ContentLeftAddOn="¥"
ContentRightAddOn="RMB" IsEnabled="False">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
<atom:ComboBoxItem>举头望明月</atom:ComboBoxItem>
<atom:ComboBoxItem>低头思故乡</atom:ComboBoxItem>
</atom:ComboBox>
</StackPanel>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml中 "prefix and suffix" 示例。
8. 验证状态(Status)
通过 Status 属性设置验证反馈,配合不同样式变体展示各种效果:
<StackPanel Orientation="Vertical" Spacing="10">
<!-- Outline 变体(默认) -->
<atom:ComboBox PlaceholderText="Please select" Width="300" Status="Error">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox PlaceholderText="Please select" Width="300" Status="Warning">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<!-- 带图标前缀的错误/警告 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
Status="Error"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=ClockCircleOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox PlaceholderText="Please select" Width="300"
Status="Warning"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=ClockCircleOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<!-- Filled 变体 + 错误/警告 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
Status="Error" StyleVariant="Filled"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=ClockCircleOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox PlaceholderText="Please select" Width="300"
Status="Warning" StyleVariant="Filled"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=ClockCircleOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<!-- Borderless 变体 + 错误/警告 -->
<atom:ComboBox PlaceholderText="Please select" Width="300"
Status="Error" StyleVariant="Borderless"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=ClockCircleOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
<atom:ComboBox PlaceholderText="Please select" Width="300"
Status="Warning" StyleVariant="Borderless"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=ClockCircleOutlined}">
<atom:ComboBoxItem>床前明月光</atom:ComboBoxItem>
<atom:ComboBoxItem>疑是地上霜</atom:ComboBoxItem>
</atom:ComboBox>
</StackPanel>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/Navigation/ComboBoxShowCase.axaml中 "Status" 示例。
9. MVVM 选中项绑定
ComboBox 继承自 Avalonia 的 SelectingItemsControl,完整支持 SelectedItem / SelectedIndex 双向绑定:
<atom:ComboBox PlaceholderText="请选择城市" Width="300"
ItemsSource="{Binding Cities}"
SelectedItem="{Binding SelectedCity}">
<atom:ComboBox.ItemTemplate>
<DataTemplate>
<atom:TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
</DataTemplate>
</atom:ComboBox.ItemTemplate>
</atom:ComboBox>
// ViewModel(使用 ReactiveUI)
public class MyViewModel : ReactiveObject
{
private CityData? _selectedCity;
public CityData? SelectedCity
{
get => _selectedCity;
set => this.RaiseAndSetIfChanged(ref _selectedCity, value);
}
public List<CityData> Cities { get; } =
[
new() { Name = "北京" },
new() { Name = "上海" },
new() { Name = "广州" },
new() { Name = "深圳" },
];
}
10. 控制动画行为
<!-- 禁用过渡动画(下拉面板不再有展开/收起动画) -->
<atom:ComboBox IsMotionEnabled="False" PlaceholderText="无动画" Width="300">
<atom:ComboBoxItem>选项一</atom:ComboBoxItem>
<atom:ComboBoxItem>选项二</atom:ComboBoxItem>
</atom:ComboBox>
常见组合模式
表单选择器
<StackPanel Orientation="Vertical" Spacing="8">
<atom:TextBlock Text="城市" />
<atom:ComboBox PlaceholderText="请选择城市" Width="300"
StyleVariant="Outline">
<atom:ComboBoxItem>北京</atom:ComboBoxItem>
<atom:ComboBoxItem>上海</atom:ComboBoxItem>
<atom:ComboBoxItem>广州</atom:ComboBoxItem>
</atom:ComboBox>
</StackPanel>
带前缀图标的选择器
<atom:ComboBox PlaceholderText="选择用户" Width="300"
ContentLeftAddOn="{antdicons:AntDesignIconProvider Kind=UserOutlined, FillBrush=#D7D7D7}">
<atom:ComboBoxItem>张三</atom:ComboBoxItem>
<atom:ComboBoxItem>李四</atom:ComboBoxItem>
<atom:ComboBoxItem>王五</atom:ComboBoxItem>
</atom:ComboBox>
协议/域名选择器
<atom:ComboBox PlaceholderText="mysite" Width="400"
LeftAddOn="http://"
RightAddOn=".com">
<atom:ComboBoxItem>mysite</atom:ComboBoxItem>
<atom:ComboBoxItem>example</atom:ComboBoxItem>
<atom:ComboBoxItem>demo</atom:ComboBoxItem>
</atom:ComboBox>
货币金额选择器
<atom:ComboBox PlaceholderText="请选择金额" Width="300"
ContentLeftAddOn="¥"
ContentRightAddOn="RMB">
<atom:ComboBoxItem>100</atom:ComboBoxItem>
<atom:ComboBoxItem>500</atom:ComboBoxItem>
<atom:ComboBoxItem>1000</atom:ComboBoxItem>
<atom:ComboBoxItem>5000</atom:ComboBoxItem>
</atom:ComboBox>