Динамические свойства для отдельного типа элементов в 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
но я понятия не имею, где и как это подключить.
Таким образом, мне нужен способ обнаружить, что свойство элемента изменилось, а затем на основе этого значения обновить свойства / метаданные, доступные в окне свойств.