对于我自己的控件,我通常会执行以下操作:
<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 甚至触发到特定状态的转换。因此,您可以在绑定到测试数据的同时轻松测试所有状态以及转换。哈克,不是真正的设计时数据,但它确实有效。