使DataTemplate可混合

时间:2009-09-04 07:58:23

标签: wpf datatemplate expression-blend

如何为ViewModel可混合创建数据模板(可在表达式混合中设计)。当我转到资源并尝试直接编辑DataTemplate时,我在Drawingborad上看到的是一个空白矩形。这是因为DataTemplate没有绑定任何东西。当然我可以创建一个UserControl并在那里的代码中创建一些设计时数据来查看模板,但我现在必须在资源(编辑)和用户控件(查看我的编辑结果)之间来回切换。是否有更直接的方式来编辑和查看我的DataTemplate?

2 个答案:

答案 0 :(得分:25)

使用起来有点困难,但Blend有一个名为“设计时数据”的功能可以帮助你。一开始很难开始,但是一旦你做了一些,这很容易。这有点迫使你进入DataContext的一个很好的模式。

以下是关于此主题的良好链接:http://www.robfe.com/2009/08/design-time-data-in-expression-blend-3/

以下是一些选择摘录:

关于设计时尺寸

  

...设计时间属性可以   被其他工具和他们安全地忽略了   在运行时被忽略   (mc:Ignorable指定   带有“d”前缀的命名空间即可   忽略)。

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 mc:Ignorable="d"
     

Expression Blend使用两个设计时间   属性(d:DesignWidth,   d:DesignHeight)指定大小   在设计时使用的控件......

关于设计时数据源

  

我偶然发现d:Datacontext   正在玩Blend 3并尝试过   在我的网站上添加“实时数据源”   窗口。我以为会这样   表现得像旧的方式   设置DataContext,但是当我跑的时候   我的申请,没有数据! ...

     

结果是,现在我们可以写了   像这样的代码:

...
<Grid ...
      DataContext="{StaticResource GameDataSource}"
      d:DataContext="{StaticResource DesignTime_DateDataSource}">

请注意,如果您希望第一方支持这些功能,则适用于Blend 3。它们非常好 - 甚至还有设计时数据的设计者,尽管我还没有研究过这些功能。

应用于DataTemplates

这是我组成的东西,但似乎有效。在这里,我使用Design-Time数据功能将数据提取到visual元素的d:DataContext中。您必须为需要DataContext集的每个顶级元素执行

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <!-- Resource dictionary entries should be defined here. -->
    <DataTemplate x:Key="MyTemplate">
        <TextBlock Text="{Binding Text}" d:DataContext="{StaticResource SampleDataSource}" />
    </DataTemplate>
</ResourceDictionary>

如果您使用DataTemplate并使用DataType集,那么绑定语法会更明确一些,但它仍然有效:

<DataTemplate DataType="{x:Type vm:MyViewModel}" >
   <TextBlock Text="{Binding Text}" 
              d:DataContext="{Binding Source={StaticResource SampleDataSource}}" />
</DataTemplate>

此策略将允许您在直接编辑时查看DataTemplate如何工作,但是除非您实际运行,否则您将无法在任何使用该DataTemplate的视图上看到结果应用程序。这是Blend的限制,因为它们似乎没有使用Mocks,而是完全替换对象。如果blend通过单击“New DataSource - &gt;基于引用对象 - &gt; MyCustomerObject”添加了创建新假数据源的功能,那么您将开始营业。

你可以通过自己的一些附属属性技巧来克服这个限制,但最多也是困难的。

<强>替代

可以在每个情况下工作的替代方案,但是设置起来有点麻烦,就是设置StaticResources,在运行时将伪数据换成真实数据,但在设计器中显示静态样本数据

这是Karl Shifflett的一篇非常好的文章,其中包括一些这些技巧和一些视频: http://karlshifflett.wordpress.com/2008/10/11/viewing-design-time-data-in-visual-studio-2008-cider-designer-in-wpf-and-silverlight-projects/

希望这有帮助, 安德森

答案 1 :(得分:1)

  

这个策略可以让你看到   DataTemplate如何工作   直接编辑它,但你不会   能够在任何视图上看到结果   除非使用DataTemplate   你真的运行应用程序。这是一个   到目前为止混合物的限制   他们似乎没有这样的事实   使用模拟,但相当完整   替换物体。如果混合了   增加了创造新假货的能力   通过单击“新建”来获取数据源   DataSource - &gt;基于Referenced   对象 - &gt; MyCustomerObject“,然后你   将开展业务。

如果我想使用真正的ViewModel模拟,我想这是创建实际ViewModel实例的最佳方式,并使用d:DataContext引用它们(例如使用ObjectDataProvider或x:Static)