如何通过Visual Studio扩展实现Azure DevOps工作项字段实时值自动复制?
实现Visual Studio中工作项字段实时复制的扩展方案
核心思路
通过Visual Studio扩展,借助Work Item Tracking客户端API监听字段的变更、失去焦点事件,实时读取源字段的当前输入值并写入目标字段,避开WITD whenchange 仅能读取保存前旧值的局限。
具体实现步骤
1. 创建Visual Studio扩展项目
- 打开Visual Studio,创建Visual Studio Package项目(选择「Extensibility」分类下的模板)。
- 引用必要程序集:
Microsoft.TeamFoundation.ClientMicrosoft.TeamFoundation.WorkItemTracking.ClientMicrosoft.VisualStudio.TeamFoundation.WorkItemTracking
2. 监听工作项加载事件
在Package类中注册工作项打开/编辑事件,获取当前工作项实例:
using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking; using Microsoft.TeamFoundation.WorkItemTracking.Client; public sealed class WorkItemFieldCopyExtension : Package { protected override void Initialize() { base.Initialize(); var witService = GetService<IWorkItemTrackingService>(); witService.WorkItemOpened += OnWorkItemOpened; } private void OnWorkItemOpened(object sender, WorkItemEventArgs e) { RegisterFieldSyncHandlers(e.WorkItem); } }
3. 绑定字段同步事件
针对目标工作项,监听源字段的值变更、失去焦点事件,完成实时复制:
private void RegisterFieldSyncHandlers(WorkItem workItem) { // 替换为你的源、目标字段引用名 const string SourceFieldRef = "System.Title"; const string TargetFieldRef = "Custom.Description"; // 监听字段值变更 workItem.FieldChanged += (sender, e) => { if (e.FieldReferenceName == SourceFieldRef) { var currentValue = workItem.Fields[SourceFieldRef].Value; workItem.Fields[TargetFieldRef].Value = currentValue; } }; // 监听源字段控件失去焦点 var formService = GetService<IWorkItemFormService>(); var sourceControl = formService.GetControl(workItem.Id, SourceFieldRef); sourceControl?.LostFocus += (sender, e) => { var currentValue = workItem.Fields[SourceFieldRef].Value; workItem.Fields[TargetFieldRef].Value = currentValue; }; }
4. 测试与部署
- 按F5启动实验性Visual Studio实例,打开Team Explorer中的工作项验证同步效果。
- 确认源字段值变更或失去焦点时,目标字段实时同步当前输入值。
- 通过「Build」菜单的「Publish Extension」打包,部署到目标Visual Studio环境。
关键注意事项
- 确保字段引用名(RefName)正确,可在Azure DevOps工作项类型定义中查看。
- 验证用户对目标字段的修改权限,避免赋值失败。
- 若目标字段也有变更监听,需添加逻辑防止循环触发同步。
内容的提问来源于stack exchange,提问作者Subrahmanya Bhat
相关产品推荐
相关产品推荐

