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