Данные времени разработки для ControlTemplate

Предоставление данных времени разработки для DataContext легко с использованием d:DataContext но как насчет управляющих свойств, на которые ссылается {TemplateBinding} или же {RelativeSource TemplatedParent} от Style.Template?

Должен ли я просто заполнить элемент управления примерами данных внутри конструктора / события Loaded, когда DesignerProperties.GetIsInDesignMode(this) возвращает истину? (Не могу сделать это, так как это нарушит нормальный опыт проектирования).

А как насчет сторонних элементов управления, которые я не могу изменить?

1 ответ

Решение

Для моего собственного контроля я обычно делаю что-то вроде:

<Style x:Key="FooStyle>
  <Setter Property="Template>
    <Setter.Value>
      <ControlTemplate TargetType="FooControl">
        <Grid d:DataContext="{d:DesignInstance FooDesignTimeData, IsDesignTimeCreatable=True}">
          ... guts of control template go here ...
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Где "FooDesignTimeData" - это класс, который предоставляет данные времени разработки в соответствующей форме (хорошей практикой здесь является реализация интерфейса из вашей модели представления времени выполнения).

Я не понимаю, почему это не сработает и для стороннего контроля. Возможно, вам даже не придется пересматривать элемент управления - вы можете обойтись, просто указав сторонний элемент управления внутри вашего стиля и предоставив ему контекст данных времени разработки, как указано выше, но я не пробовал этот сценарий. Я предполагаю, что вы столкнетесь со всеми этими проблемами, потому что вы вынуждены использовать элемент управления, который не имеет большого времени разработки (например, предоставляя Vendor.Controls.Design.dll или Vendor.Controls.Expression.Design. файл длл).

Для работы с TemplateBindings у меня нет отличного решения. Обычно я создаю тестовую страницу, которая отображает мой элемент управления и позволяет мне переключать шаблоны. Во время интеграции у вас будет дополнительное представление (либо внутри вашего приложения, либо в виде отдельного приложения), которое позволяет вам создавать и управлять экземплярами элемента управления по мере необходимости. Здесь часто полезно целевое действие запуска GoToStateAction из Blend SDK. Например, создайте кнопку для каждого визуального состояния, а затем используйте функцию "Даже щелкнуть", чтобы вызвать переход к определенному состоянию. Таким образом, вы можете легко протестировать все ваши состояния плюс переходы, в то время как вы должны проверить данные. Дурацкие и не особо рассчитанные данные времени, но это работает.

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