WPF:如何在设计模式下创建示例数据?
我想创建仅在设计模式下创建的示例数据(当 WPF 窗口显示在 Visual Studio WPF 设计器或 Expression Blend 中时)。我尝试了这个:
public MainWindow()
{
InitializeComponent();
if (DesignerProperties.GetIsInDesignMode(this))
{
DataContext = new Person() { Name = "Harry" };
}
}
看来设计者没有调用Window类的构造函数。我需要在 C# 代码中创建示例数据,因为它们的实例化更加复杂。有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您在 XAML 中直接或使用 Binding 设置 DataContext,则可以避免构造函数跳过的问题。该工具的较新版本还支持设置 ad:DataContext,该设置仅在设计时调用以设置 DataContext。如果您的实例化无法直接在 XAML 中完成(即构造函数参数),您只需在 MainWindow.xaml.cs 中声明一个 get 属性即可实例化并返回您的设计数据实例。将整个对象创建保留在 getter 中将阻止它在运行时创建,因为它永远不会被调用。
然后在 XAML 中,您可以将窗口的 d:DataContext 绑定到新属性。
还有许多其他选项可以执行此操作,但这是最接近 UI 的选项,因此通常最容易添加到现有代码中。 Josh Smith 最近对不同的选项做了很好的概述: 设计时数据仍然是数据
If you do the setting of the DataContext in XAML, either directly or with a Binding, you avoid the issue of constructor skipping. The newer versions of the tools also support setting a d:DataContext that will only be invoked at design time to set the DataContext. If your instantiation can't be done directly in XAML (i.e. constructor parameters) you can just declare a get property in MainWindow.xaml.cs to instantiate and return your design data instance. Keeping the entire object creation in the getter will keep it from being created at run-time because it will never be called.
Then in XAML you can bind d:DataContext for the window to the new property.
There are many other options for doing this but this is the closest to the UI so usually the easiest to add into existing code. Josh Smith recently did a good overview of different options: Design-time data is still data
现在我正在使用 Visual Studio 2010 和 Expression Blend 4 的设计时支持。这个新功能满足了我的大部分要求。
BookLibrary 示例应用程序显示了其工作原理>WPF 应用程序框架 (WAF)。请下载.Net4版本的WAF。
Now I’m using the design-time support of Visual Studio 2010 and Expression Blend 4. This new feature meets most of my requirements.
How this works is shown in the BookLibrary sample application of the WPF Application Framework (WAF). Please download the .Net4 version of WAF.