Как создать два иерархических нитатематических пластинах, которые являются взаимоприятными в Silverlight?

StackOverflow https://stackoverflow.com/questions/3805464

Вопрос

Учитывая, что:

  1. DataTemplates не может быть назначен Targettype
  2. Ссылки 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top