ControlTemplate的设计时数据

时间:2012-05-24 14:02:54

标签: wpf styles expression-blend controltemplate design-time

使用d:DataContext可以很容易地为DataContext提供设计时数据,但是{TemplateBinding}引用的{RelativeSource TemplatedParent}Style.Template引用的控件属性呢?

DesignerProperties.GetIsInDesignMode(this)返回true时,我是否应该在构造函数/ Loaded事件中使用示例数据填充控件? (不能这样做,因为它会打破正常的设计经验)。

我无法修改的第三方控制怎么办?

1 个答案:

答案 0 :(得分:4)

对于我自己的控件,我通常会这样做:

<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>

其中&#34; FooDesignTimeData&#34;是一个以适当的形式提供设计时数据的类(从运行时视图模型实现接口是一个很好的做法)。

我不明白为什么这对第三方控制也不起作用。您甚至可能不需要重新控制控件 - 您可以通过在您的样式中指定第三方控件并为其提供上面指定的设计时数据上下文来逃避,但我还没有尝试过场景。我假设您已经解决了所有这些问题,因为您被迫使用没有很好设计时间体验的控件(例如提供Vendor.Controls.Design.dll或Vendor.Controls。 Expression.Design.dll文件)。

要使用TemplateBindings,我没有一个很好的解决方案。通常我会创建一个显示我的控件的测试页面,并允许我切换模板。在集成期间,您将有一个额外的视图(在您的应用程序内或作为单独的应用程序),允许您根据需要创建和操作控件的实例。 Blend SDK中的GoToStateAction目标触发器操作在此处通常很有用。例如,为每个可视状态创建一个按钮,然后使用Click even触发向特定状态的转换。因此,您可以在绑定测试数据时轻松测试所有状态和转换。 Hacky并没有真正设计时间数据,但它确实有用。