Динамические свойства для отдельного типа элементов в Visual Studio Common Project System

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

Правила xaml являются фиксированными, и интерфейс IAdditionalRuleDefinitionsService, по-видимому, динамически применяет свойства, но для каждого элемента (в основном изменяет правило xaml). Хотя мне никогда не удавалось проверить это, просто добавив несколько свойств, и я не думаю, что это даст то, что мне нужно.

Примером является группа элементов, где каждый файл имеет свой набор свойств на основе свойства Type.

<ItemGroup>
<File Include="SampleA.sample">
  <Type>A</Type>
  <TypeA_PropertyA>ValueA</TypeA_PropertyA>
  <TypeA_PropertyB>ValueB</TypeA_PropertyB>
  <TypeA_PropertyC>ValueC</TypeA_PropertyC>
</File>

<File Include="Sample2.sample">
  <Type>2</Type>
  <Type2_Property1>Value1</Type2_Property1>
  <Type2_Property2>Value2</Type2_Property2>
  <Type2_Property3>Value3</Type2_Property3>
</File>
</ItemGroup>

Я сделал это, используя старую систему около 10 лет назад, возвращая PropertyDescriptorCollection из Microsoft.VisualStudio.Project.FileNodeProperties.GetProperties, но CPS работает совершенно по-другому. Это должно быть возможно сделать, даже если мне нужно как-то использовать EnvDTE.Project.

Я пытался заглянуть в IProjectTreePropertiesProvider.CalculatePropertyValues, но я не вижу ничего, что могло бы помочь.

Public Sub CalculatePropertyValues(propertyContext As IProjectTreeCustomizablePropertyContext, propertyValues As IProjectTreeCustomizablePropertyValues) Implements IProjectTreePropertiesProvider.CalculatePropertyValues
    If propertyValues.Flags.Contains(ProjectTreeFlags.Common.ProjectRoot) Then
        propertyValues.Icon = ImageMonikers.ProjectIconImageMoniker.ToProjectSystemType
    End If

    If propertyValues.Flags.Contains(ProjectTreeFlags.Common.SourceFile) Then
        Dim obj As Object = Nothing
        Me.Project.ProjectHierarchy.GetProperty(VSITEMID.Root, __VSHPROPID.VSHPROPID_ExtObject, obj)

        Dim DTEProject = CType(obj, EnvDTE.Project)

        Dim project = TryCast(DTEProject.Object, VSLangProj.VSProject)

        ' Something here?
    End If
End Sub

После изучения всех открытых классов я думаю, что это может быть как-то возможно с интерфейсом вроде IProjectTree, который имеет функцию

Function SetBrowseObjectProperties(browseObjectProperties As IRule) As IProjectTree

но я понятия не имею, где и как это подключить.

Таким образом, мне нужен способ обнаружить, что свойство элемента изменилось, а затем на основе этого значения обновить свойства / метаданные, доступные в окне свойств.

0 ответов

Другие вопросы по тегам