我正在使用4.0系列WPF工具的新d:DesignInstance功能。效果很棒!
我遇到的唯一问题是:如何在实例上设置属性?鉴于这样的事情:
<Grid d:DataContext="{d:DesignInstance plugin:SamplePendingChangesViewModel, IsDesignTimeCreatable=True}"/>
如何在viewmodel上设置属性,除了在默认ctor中设置它们还是通过其他对象初始值设定器进行路由?
我试了一下但是VS在编译时给出了错误“d:找不到DataContext”:
<Grid>
<d:DataContext>
<d:DesignInstance IsDesignTimeCreatable="True">
<plugin:SamplePendingChangesViewModel ActiveTagIndex="2"/>
</d:DesignInstance>
</d:DataContext>
目前我将回到使用资源和'd:DataContext = {StaticResource SampleData}',我可以在其中设置资源中的属性。
有没有办法通过d:DesignInstance?
来实现答案 0 :(得分:22)
作为@jberger,您应该使用d:DesignData
而不是内联d:DataContext
。
但是你也可以在xaml文件中设置内联的d:DataContext,秘诀是使用正确的类(DesignProperties
)来限定d:DataContext
属性:
<d:DesignProperties.DataContext>
<plugin:SamplePendingChangesViewModel ActiveTagIndex="2"/>
</d:DesignProperties.DataContext>
你怎么知道哪个班级符合资格?将鼠标悬停在属性语法中设置的属性上,将显示工具提示,其中包含完全限定的属性名称。
另请注意,我不使用d:DesignInstance
标记exstension作为其工作,具体是创建一个为您提供名称的类型的实例(或者如果它不能在设计中实例化则生成该类型的代理-时间)。这不是我们想要的,我们想在这种情况下在内联xaml中定义实例。
实际上,d:DesignData
(也是标记扩展)的工作方式大致相同,只是它查找xaml文件并将其反序列化为要使用的实际实例,而不是仅使用默认构造函数。
为了完整起见,我还应该提一下,你可以使用DesignData和DesignInstance以及元素语法,使用它们的完整类名(xxxExtension):
<d:DesignProperties.DataContext>
<d:DesignDataExtension Source="SampleData.xaml"></d:DesignDataExtension>
</d:DesignProperties.DataContext>
对于大多数标记扩展都是如此,但它不需要遵循这个命名对象(Binding类是一个值得注意的例外)更多信息可以在这里找到: