我用下面的代码分叉了一个项目:
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 });
将工作项的ID添加到当前挂起的更改中。
现在,我想链接在“Associate”或“Resolve”(关联和解析)之间选择的工作项,具体取决于用户点击插件界面的按钮,如下所示:
如果用户点击“关联并解决”,则工作项应关联并在办理登机手续时标记为已解决。
如果用户点击“仅关联”,则工作项必须仅链接到变更集,但不会解决。
欢迎任何帮助
答案 0 :(得分:25)
这不是WorkItem的属性。这是工作项的签到操作。详细信息,请参阅此链接Changing the Default CheckIn Option to Associate in TFS 2012
您可能需要使用CheckinWorkItemAction
枚举。来自MSDN的更多详细信息。
关于TFS - VS Extension: Add work item to pending changes via API的类似问题,也请查看此链接:C# Programmatically Checking in code changes with TFS API while associating the changeset to a Work Item
更新
如果您想将默认状态'resolve'更改为'关联',则需要
更改设置注册表项
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\1x.0\TeamFoundation\SourceControl\Behavior\ResolveAsDefaultCheckinAction
to False.
或者对于VS2015,有一个选项工具&gt;选项&gt;源控制&gt; Visual Studio Team Foundation&gt; “解决相关的工作项目 签入”。
注意:以上两者仅影响您的客户端计算机。
否则,对于所有用户,您需要编辑正在使用的工作项类型的工作项模板定义(错误,任务等)。您可以参考此问题的详细步骤How to disable auto done status for task in checkin
答案 1 :(得分:2)
工作项和变更集之间只有一种链接类型,链接信息存储在工作项中。 Visual Studio中“Associate”和“Resolve”之间的区别在于“Associate”仅将工作项链接到changeset,而“Resolve”会在将工作项链接到changeset后将工作项的状态更改为“已解决”。 / p>
如果您正在开发自己的插件,则需要编写代码以手动实现这些功能。
以下代码显示了如何将工作项链接到变更集:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
namespace APPI
{
class Program
{
static void Main(string[] args)
{
string url = "http://xxx.xxx.xxx.xxx:8080/tfs/DefaultCollection";
TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri(url));
WorkItemStore wis = ttpc.GetService<WorkItemStore>();
VersionControlServer vcs = ttpc.GetService<VersionControlServer>();
int wid = 82;
int cid = 332;
WorkItem wi = wis.GetWorkItem(wid);
Changeset cs = vcs.GetChangeset(cid);
ExternalLink el = new ExternalLink(wis.RegisteredLinkTypes["Fixed in Changeset"], cs.ArtifactUri.AbsoluteUri);
wi.Links.Add(el);
wi.Save();
}
}
}
答案 2 :(得分: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 });
我添加了一些新代码(那些是不同的功能,好吗?)...第二次调用将等待工作项显示在Pending Changes'相关工作项'部分,并将从Resolve更改其关联关联'手动'。
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();
尽管此代码有效,但我仍在努力寻找运行第二种方法的更好解决方案。注释中建议的“默认值”将不起作用,因为开发人员应该能够关联/解决选择按钮的问题。