6

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

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

我无法修改的第三方控件呢?

4

1 回答 1

5

对于我自己的控件,我通常会执行以下操作:

<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”是一个以适当形式提供设计时数据的类(从运行时视图模型实现接口是一个很好的做法)。

我不明白为什么这也不适用于第 3 方控制。您甚至可能不必重新模板化控件——您可以通过在样式中指定第 3 方控件并为其提供上面指定的设计时数据上下文来摆脱困境,但我还没有尝试过这种情况。我假设您会遇到所有这些麻烦,因为您被迫使用没有出色设计时体验的控件(例如通过提供 Vendor.Controls.Design.dll 或 Vendor.Controls.Expression.Design。 dll 文件)。

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

于 2012-07-08T17:25:39.363 回答