如何在XAML中设置d:DesignInstance的属性?

时间:2010-04-26 20:49:27

标签: wpf xaml

我正在使用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?

来实现

1 个答案:

答案 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类是一个值得注意的例外)更多信息可以在这里找到:

Markup Extensions and WPF XAML