6.1 KiB
Transfer 使用文档
本文档介绍 AtomUI Transfer 控件的使用方式与常见场景。
📖 Gallery 源码位置:
controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/TransferShowCase.axaml
前置准备
AXAML 命名空间
xmlns:atom="https://atomui.net"
C# 命名空间
using AtomUI.Desktop.Controls;
基本用法
最基本的穿梭框,提供数据源和目标键,即可完成双栏穿梭操作:
<atom:ListTransfer Name="BasicListTransfer"
SourceTitle="Source"
TargetTitle="Target" />
在代码后置中设置数据源:
var items = new List<ListItemData>();
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<EntityKey>
{
new(1), new(3), new(5)
};
单向穿梭
设置 IsOneWay="True" 后,只有"转移到目标"按钮可见,目标面板以删除按钮替代选择框:
<atom:ListTransfer Name="OneWayTransferList"
SourceTitle="Source"
TargetTitle="Target"
IsOneWay="True"
IsEnabled="{Binding OneWayTransferEnabled}" />
<atom:ToggleSwitch IsChecked="{Binding OneWayTransferEnabled, Mode=TwoWay}"
OnContent="disable"
OffContent="enable" />
带搜索的穿梭框
启用 IsFilterEnabled 后在面板头部下方显示搜索框。可通过 FilterValueSelector 指定搜索匹配的数据字段:
<atom:ListTransfer Name="SearchTransferList"
IsFilterEnabled="True"
FilterPlaceholderText="Search here"
FilterValueSelector="{Binding TransferFilterValueSelector}" />
高级用法
自定义穿梭按钮文本、列表宽度、页脚内容和列表项模板:
<atom:ListTransfer ToTargetButtonText="to right"
ToSourceButtonText="to left"
ListWidth="300"
Name="AdvanceTransfer">
<atom:ListTransfer.SourceViewFooter>
<atom:Button SizeType="Small" Click="ReloadAdvancedTransferItems">
Left button reload
</atom:Button>
</atom:ListTransfer.SourceViewFooter>
<atom:ListTransfer.TargetViewFooter>
<atom:Button SizeType="Small" Click="ReloadAdvancedTransferItems">
Right button reload
</atom:Button>
</atom:ListTransfer.TargetViewFooter>
<atom:ListTransfer.ItemTemplate>
<DataTemplate x:DataType="viewModels:SearchCaseItemData">
<TextBlock TextTrimming="CharacterEllipsis">
<Run Text="{Binding Content}" />
<Run Text="-" />
<Run Text="{Binding Description}" />
</TextBlock>
</DataTemplate>
</atom:ListTransfer.ItemTemplate>
</atom:ListTransfer>
分页穿梭框
当数据量很大时,设置 PageSize 启用分页显示:
<atom:ListTransfer Name="PaginationTransferList"
IsOneWay="{Binding PaginationIsOneWay}"
PageSize="10"
ListHeight="370" />
<atom:ToggleSwitch IsChecked="{Binding PaginationIsOneWay, Mode=TwoWay}"
OnContent="one way"
OffContent="one way" />
启用分页后列表宽度自动使用
ListWidthLG(250px),选择操作下拉菜单会增加"选择当页"、"反选当页"等选项。
树形穿梭框
使用 TreeTransfer 在源面板展示树形结构数据:
<atom:TreeTransfer Name="TreeTransfer"
IsStretchView="True"
IsOneWay="{Binding TreeTransferIsOneWay}">
<atom:TreeTransfer.SourceView>
<atom:TransferTreeView IsDefaultExpandAll="True" />
</atom:TreeTransfer.SourceView>
</atom:TreeTransfer>
<atom:ToggleSwitch IsChecked="{Binding TreeTransferIsOneWay, Mode=TwoWay}"
OnContent="one way"
OffContent="one way" />
树形穿梭的数据项需实现 ITreeItemNode 接口(含 Children 属性和 Header 属性),穿梭后目标面板以扁平列表展示已选节点。
验证状态
Transfer 支持 Status 属性显示验证状态边框:
<!-- Error 状态 —— 红色边框 -->
<atom:ListTransfer Status="Error" />
<!-- Warning 状态 —— 黄色边框 -->
<atom:ListTransfer Status="Warning" />
事件处理
SelectionChanged 事件
穿梭操作完成后触发,可获取源面板和目标面板的键集合:
transfer.SelectionChanged += (sender, args) =>
{
var sourceKeys = args.SourceSelectedKeys;
var targetKeys = args.TargetSelectedKeys;
// 处理穿梭后的逻辑
};
数据模型
列表穿梭数据项
列表穿梭的数据项需实现 IItemKey 接口。最简单的方式是使用内置的 ListItemData:
var item = new ListItemData
{
ItemKey = new EntityKey(1),
Content = "Item 1"
};
自定义数据模型
也可以自定义数据模型,只要实现 IItemKey 接口即可:
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 的行为一致——树形穿梭的目标面板扁平化展示已选叶节点,源面板通过遮罩(灰显)表示已转移的节点。