以下のコードでプロジェクトをフォークしました:
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によってワークアイテムが現在保留中の変更に追加されます。
ここで、ユーザーがプラグインのインターフェイスでクリックしたボタンに応じて、「関連付け」または「解決」(関連付けと解決)のいずれかを選択して作業項目をリンクします。
ユーザーが[関連付けて解決]をクリックした場合、チェックイン時に作業項目が関連付けられ、解決済みとしてマークされている必要があります。
ユーザーが「関連付けのみ」をクリックした場合、作業項目は変更セットにのみリンクする必要があり、解決することはできません。
どんな助けでも大歓迎です
ほら、私はそれを達成しました、しかし私はそれが間違っていることを知っています:
質問のコードを使用して作業項目を含めた後:
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 });
新しいコードをいくつか追加しました(これらは異なる関数ですよね?)...この2番目の呼び出しは、作業項目が[保留中の変更]の[関連作業項目]セクションに表示されるのを待ち、その関連付けを[解決]から[関連付け]に変更します。手動で」。
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();
このコードの有効性にもかかわらず、私はまだ2番目のメソッドを実行する上でより良い解決策に取り組んでいます。コメントで提案された「デフォルト値」は機能しません。これは、開発者がボタンの選択でのみ関連付け/解決できる必要があるためです。
これはWorkItemのプロパティではありません。これは、ワークアイテムのチェックインアクションです。このリンクを参照できる詳細 TFS 2012で関連付けるデフォルトのチェックインオプションの変更
CheckinWorkItemAction
列挙を使用する必要がある場合があります。 [〜#〜] msdn [〜#〜] からの詳細情報。
TFS-VS拡張機能:APIを介して保留中の変更に作業項目を追加する に関する同様の質問と、このリンクも確認してください: C#プログラムで変更セットを作業項目に関連付けながらTFSAPIを使用してコード変更を確認する
更新
デフォルトの状態 'resolve'を 'associate'に変更する場合は、次のことを行う必要があります。
レジストリキーのセットを変更しますHKEY_CURRENT_USER\Software\Microsoft\VisualStudio\1x.0\TeamFoundation\SourceControl\Behavior\ResolveAsDefaultCheckinAction to False.
またはVS2015の場合、[ツール]> [オプション]> [ソース管理]> [Visual Studio TeamFoundation]> [チェックイン時に関連する作業項目を解決する]オプションがあります。
注:上記の両方は、クライアントマシンにのみ影響します。
それ以外の場合は、すべてのユーザーについて、使用している作業項目のタイプ(バグ、タスクなど)の作業項目テンプレート定義を編集する必要があります。この質問を参照できる詳細な手順 チェックイン時にタスクの自動完了ステータスを無効にする方法
作業項目と変更セットの間にはリンクタイプが1つだけあり、リンク情報は作業項目に保存されます。 Visual Studioの「関連付け」と「解決」の違いは、「関連付け」は作業項目を変更セットにリンクするだけであり、「解決」は作業項目を変更セットにリンクした後に作業項目のステータスを「解決済み」に変更することです。
独自のプラグインを開発している場合は、これらの機能を手動で実現するためのコードを作成する必要があります。
次のコードは、ワークアイテムをチェンジセットにリンクする方法を示しています。
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();
}
}
}
VS 2015の場合。「方法:「アソシエート」を作業項目のデフォルトアクションにする」 https://blogs.msdn.Microsoft.com/mitrik/2010/12/03/how-to-make -associate-the-default-action-for-work-items /