# Transfer 使用文档
本文档介绍 AtomUI Transfer 控件的使用方式与常见场景。
> 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/TransferShowCase.axaml`
---
## 前置准备
### AXAML 命名空间
```xml
xmlns:atom="https://atomui.net"
```
### C# 命名空间
```csharp
using AtomUI.Desktop.Controls;
```
---
## 基本用法
最基本的穿梭框,提供数据源和目标键,即可完成双栏穿梭操作:
```xml
```
在代码后置中设置数据源:
```csharp
var items = new List();
for (var i = 0; i < 20; i++)
{
items.Add(new ListItemData
{
ItemKey = new EntityKey(i),
Content = $"content{i + 1}"
});
}
BasicListTransfer.ItemsSource = items;
BasicListTransfer.TargetKeys = new List
{
new(1), new(3), new(5)
};
```
---
## 单向穿梭
设置 `IsOneWay="True"` 后,只有"转移到目标"按钮可见,目标面板以删除按钮替代选择框:
```xml
```
---
## 带搜索的穿梭框
启用 `IsFilterEnabled` 后在面板头部下方显示搜索框。可通过 `FilterValueSelector` 指定搜索匹配的数据字段:
```xml
```
---
## 高级用法
自定义穿梭按钮文本、列表宽度、页脚内容和列表项模板:
```xml
Left button reload
Right button reload
```
---
## 分页穿梭框
当数据量很大时,设置 `PageSize` 启用分页显示:
```xml
```
> 启用分页后列表宽度自动使用 `ListWidthLG`(250px),选择操作下拉菜单会增加"选择当页"、"反选当页"等选项。
---
## 树形穿梭框
使用 `TreeTransfer` 在源面板展示树形结构数据:
```xml
```
树形穿梭的数据项需实现 `ITreeItemNode` 接口(含 `Children` 属性和 `Header` 属性),穿梭后目标面板以扁平列表展示已选节点。
---
## 验证状态
Transfer 支持 `Status` 属性显示验证状态边框:
```xml
```
---
## 事件处理
### SelectionChanged 事件
穿梭操作完成后触发,可获取源面板和目标面板的键集合:
```csharp
transfer.SelectionChanged += (sender, args) =>
{
var sourceKeys = args.SourceSelectedKeys;
var targetKeys = args.TargetSelectedKeys;
// 处理穿梭后的逻辑
};
```
---
## 数据模型
### 列表穿梭数据项
列表穿梭的数据项需实现 `IItemKey` 接口。最简单的方式是使用内置的 `ListItemData`:
```csharp
var item = new ListItemData
{
ItemKey = new EntityKey(1),
Content = "Item 1"
};
```
### 自定义数据模型
也可以自定义数据模型,只要实现 `IItemKey` 接口即可:
```csharp
public class MyTransferItem : IItemKey
{
public EntityKey? ItemKey { get; set; }
public string Title { get; set; }
public string Description { get; set; }
}
```
### 树形穿梭数据项
树形穿梭需实现 `ITreeItemNode` 接口,包含 `Children` 子节点集合和 `Header` 展示文本。
---
## 常见问题
### Q: 如何控制面板宽度?
通过 `ListWidth` 属性设置固定宽度,或设置 `IsStretchView="True"` 让面板填满可用空间。
### Q: 分页模式下列表变宽了?
这是设计行为——启用分页后自动使用 `ListWidthLG`(250px)以容纳分页控件。
### Q: 如何自定义过滤逻辑?
实现 `IValueFilter` 接口并赋值给 `Filter` 属性即可替换默认的 `Contains` 过滤器。
### Q: TreeTransfer 的目标面板为什么是扁平列表?
与 Ant Design 的行为一致——树形穿梭的目标面板扁平化展示已选叶节点,源面板通过遮罩(灰显)表示已转移的节点。