如何关联的工作项目在Visual Studio中"关联"或"解决" TFS API(VS2015)?

Edu*_*léh 11 tfs tfs-sdk visual-studio visual-studio-2012 visual-studio-2015

我用下面的代码分叉了一个项目:

var pc = ParentSection.GetService<IPendingChangesExt>();

var model = pc.GetType().GetField("m_workItemsSection", BindingFlags.NonPublic | BindingFlags.Instance);
var t = model.FieldType;
var mm = model.GetValue(pc);

var m = t.GetMethod("AddWorkItemById", BindingFlags.NonPublic | BindingFlags.Instance);

m.Invoke(mm, new object[] { selectedWorkItemId });
Run Code Online (Sandbox Code Playgroud)

这会将工作项的ID添加到当前挂起的更改中.

现在,我想链接在"Associate"或"Resolve"(关联和解析)之间选择的工作项,具体取决于用户点击插件界面的按钮,如下所示: 在此输入图像描述

如果用户单击"关联并解决",则应在签入时将工作项关联并标记为已解决.

如果用户单击"仅关联",则工作项必须仅链接到变更集,但不能解决.

欢迎任何帮助

Pat*_*SFT 26

这不是WorkItem的属性.这是工作项的签到操作.您可以参考此链接的详细信息将默认CheckIn选项更改为在TFS 2012中关联

您可能需要使用CheckinWorkItemAction枚举.来自MSDN的更多详细信息.

关于TFS的相似问题 - VS扩展:通过API将工作项添加到挂起的更改中并检查此链接:C#以编程方式将变更集与工作项关联时,使用TFS API检查代码更改


更新

如果要将默认状态"resolve"更改为"associate",则需要

  • 更改设置注册表项 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\1x.0\TeamFoundation\SourceControl\Behavior\ResolveAsDefaultCheckinAction to False.

  • 或者对于VS2015,有一个选项工具>选项>源代码管理> Visual Studio Team Foundation>"在签入时解析关联的工作项".

在此输入图像描述

注意:以上两者仅影响您的客户端计算机.

否则,对于所有用户,您需要编辑正在使用的工作项类型的工作项模板定义(错误,任务等).您可以参考此问题的详细步骤如何在签入时禁用任务的自动完成状态


Edu*_*léh 1

看,我已经完成了,但我知道这是错误的:

使用问题代码包含工作项后:

IPendingChangesExt pendingChangesExt = ParentSection.GetService<IPendingChangesExt>();

var workItemSection = pendingChangesExt.GetType().GetField("m_workItemsSection", BindingFlags.NonPublic | BindingFlags.Instance);

var modelType = workItemSection.FieldType;
var model = workItemSection.GetValue(pendingChangesExt);

var m = modelType.GetMethod("AddWorkItemById", BindingFlags.NonPublic | BindingFlags.Instance);                

m.Invoke(model, new object[] { selectedWorkItemId });
Run Code Online (Sandbox Code Playgroud)

我添加了一些新代码(这些是不同的函数,好吗?)...第二个调用将等待工作项出现在待更改“相关工作项”部分,并将其关联从“解决”更改为“关联”手动”。

IPendingChangesExt pendingChangesExt = ParentSection.GetService<IPendingChangesExt>();

var model = pendingChangesExt
                     .GetType()
                     .GetField("m_workItemsSection", BindingFlags.NonPublic | BindingFlags.Instance);

var modelType = model.FieldType;
var workItemSection = model.GetValue(pendingChangesExt);

var selectedWil = workItemSection
                              .GetType()
                              .GetProperty("SelectedWorkItems")
                              .GetValue(workItemSection) as ObservableCollection<WorkItemValueProvider>;

var availablWil = workItemSection
                              .GetType()
                              .GetProperty("WorkItemsListProvider")
                              .GetValue(workItemSection) as WorkItemsListProvider;

// Waiting for section to be ready to start association
while (!availablWil.WorkItems.Where(x => x.Id == selectedWorkItemId).Any())
{                    
    await System.Threading.Tasks.Task.Delay(25);
}

selectedWil.Clear();
selectedWil.Add(availablWil.WorkItems.Where(x => x.Id == selectedWorkItemId).First());

EnvDTE80.DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
dte2.ExecuteCommand("TeamFoundationContextMenus.WorkItemActionLink.TfsContextPendingChangesPageWorkItemActionLinkAssociate");

selectedWil.Clear();
Run Code Online (Sandbox Code Playgroud)

尽管此代码有效,但我仍在努力寻找运行第二种方法的更好解决方案。注释中建议的“默认值”将不起作用,因为开发人员应该只能在选择按钮时进行关联/解析。