Как я могу прослушать удаление ProjectItem через DTE? - PullRequest
3 голосов
/ 15 мая 2010

У меня есть дизайнер, который полагается на существование других элементов решения. Если один из этих элементов удален, конструктор аварийно завершает работу, и вам нужно отредактировать его как XML, чтобы исправить. Не совсем удобно для пользователя.

Однако у меня есть объект DTE, представляющий экземпляр Visual Studio, а также ProjectItems, от которых я зависим.

Можно ли где-то в глубине DTE зарегистрировать прослушиватель для удаления этого ProjectItem? И если так, как бы я это сделал?

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Похоже, виновником здесь является сборка мусора. Я обнаружил, что следующие два набора событий ведут себя одинаково.

Events2 events2 = dte.Events as Events2;
if (events2 != null)
{
    this.projectItemsEvents = events2.ProjectItemsEvents;
    this.projectItemsEvents.ItemAdded += this.ProjectItemsEvents_ItemAdded;
    this.projectItemsEvents.ItemRemoved += this.ProjectItemsEvents_ItemRemoved;
    this.projectItemsEvents.ItemRenamed += this.ProjectItemsEvents_ItemRenamed;
}

this.csharpProjectItemsEvents =
    dte.Events.GetObject("CSharpProjectItemsEvents") as ProjectItemsEvents;
if (this.csharpProjectItemsEvents != null)
{
    this.csharpProjectItemsEvents.ItemAdded += this.CSharpProjectItemsEvents_ItemAdded;
    this.csharpProjectItemsEvents.ItemRemoved += this.CSharpProjectItemsEvents_ItemRemoved;
    this.csharpProjectItemsEvents.ItemRenamed += this.CSharpProjectItemsEvents_ItemRenamed;
}

Ключом к обоим было сохранение ссылки на объект событий в подписчике. Как только я добавил ссылку, они вели себя так, как я ожидал.

private ProjectItemsEvents projectItemsEvents;
private ProjectItemsEvents csharpProjectItemsEvents;
1 голос
/ 15 мая 2010

Ознакомьтесь с этой статьей часто задаваемых вопросов , в которой объясняется, как зарегистрироваться для событий ProjectItems (включая ItemDeleted).

...