Как создать два иерархических нитатематических пластинах, которые являются взаимоприятными в Silverlight?
-
25-09-2019 - |
Вопрос
Учитывая, что:
- DataTemplates не может быть назначен Targettype
- Ссылки StaticResource могут ссылаться только ранее
Как один шаблон следующая ситуация в дереве?
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
Эта структура хорошо поддается дереву, которое будет выглядеть так:
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
Это будет тривиально для шаблона в WPF из-за TargetType
свойство HierarchicalDataTemplate
. Отказ В Silverlight мы должны были бы сделать что-то большее, как:
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
Что, очевидно, не может работать, потому что ResourceTemplate
не может ссылаться PropertyTemplate
Потому что он определяется после него в документе XAML. Итак, как вы решите эту проблему с курицей и яйцо?
Решение
Единственное разумное решение, которое я нашел, состоит в том, чтобы создать третий тип ViewModel, который будет обернуть любой из первых двух типов (ресурсов или свойство), и предоставлять общие свойства для привязки: (например, детей). Это все еще не очень оптимально, хотя, если два типа нуждаются в очень разных шаблонах, потому что в этот момент я использую VisualStateManager
переключаться между шаблонами для данных.
<HierarchicalDataTemplate x:Key="TreeItemTemplate"
ItemSource="{Binding Children}">
<ContentPresenter Content="{Binding}">
<VisualStateManager.Groups>
<VisualStateGroup>
<VisualState Name="IsResource">
<!-- set resource template -->
</VisualState>
<VisualState Name="IsProperty">
<!-- set property template -->
</VisualState>
</VisualStateGroup>
</VisualStateManager.Groups>
</ContentPresenter>
</HierarchicalDataTemplate>