2012-05-24 1 views
5

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

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

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

ответ

2

Для моих собственных элементов управления я обычно делаю что-то вроде:

<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. dll).

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

+0

Как я уже сказал, '{Binding}' легко из-за 'd: DataContext', но я после' {TemplateBinding} 's. –

+0

Вы пытались сделать выше, но назначили d: DataContext как часть стиля? У меня нет отличного решения для этой ситуации: обычно я создаю тестовую страницу, которая отображает мой элемент управления и позволяет мне менять шаблоны. Хакки, но это работает. –

+0

Это кажется разумным. Придется попробовать это сам. Но вы должны изменить XAML для версии интеграции, или можете ли вы предоставить Binding там тоже? –