16

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

4

2 回答 2

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)来指定要在设计时使用的控件的大小...

关于设计时数据源

我在玩 Blend 3 时偶然发现了 d:Datacontext,并尝试将“实时数据源”添加到我的窗口中。我认为它的行为就像设置 DataContext 的旧方法一样,但是当我运行我的应用程序时,没有数据!...

所以结果是,现在我们可以编写如下代码:

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

请注意,如果您想要对这些功能的第一方支持,这适用于 Blend 3。它们非常好——甚至还有设计时数据的设计器,尽管我还没有研究过这些特性。

应用于数据模板

这是我编造的,但它似乎有效。在这里,我使用设计时数据功能将数据拉入可视元素的 d:DataContext。您必须为每个需要 DataContext set 的顶级元素执行此操作。

<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>

如果您使用带有 DataType 集的 DataTemplate,则绑定语法会更加明确,但它仍然有效:

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

此策略将允许您在直接编辑 DataTemplate 时查看它的工作方式,但是除非您实际运行应用程序,否则您将无法在任何使用该 DataTemplate 的视图上看到结果。这是 Blend 目前的一个限制,因为它们似乎没有使用 Mocks,而是使用完整的替换对象。如果 blend 曾经通过单击“New DataSource -> Based on Referenced Object -> MyCustomerObject”添加了创建新的假数据源的能力,那么您将开展业务。

您可以通过自己的一些附加属性技巧来克服此限制,但这充其量是困难的。

选择

一种适用于各种情况但设置起来有点麻烦的替代方法是设置静态资源,在运行时将假数据换成真实数据,但在设计器中显示静态样本数据。

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

希望这会有所帮助,安德森

于 2009-09-08T16:44:32.287 回答
1

此策略将允许您在直接编辑 DataTemplate 时查看它的工作方式,但是除非您实际运行应用程序,否则您将无法在任何使用该 DataTemplate 的视图上看到结果。这是 Blend 目前的一个限制,因为它们似乎没有使用 Mocks,而是使用完整的替换对象。如果 blend 曾经通过单击“New DataSource -> Based on Referenced Object -> MyCustomerObject”添加了创建新的假数据源的能力,那么您将开展业务。

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

于 2009-09-18T12:57:54.113 回答