使DataTemplate可混合

bit*_*onk 16 wpf datatemplate expression-blend

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

And*_*mes 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"
Run Code Online (Sandbox Code Playgroud)

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

关于设计时数据源

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

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

...
<Grid ...
      DataContext="{StaticResource GameDataSource}"
      d:DataContext="{StaticResource DesignTime_DateDataSource}">
Run Code Online (Sandbox Code Playgroud)

请注意,如果您希望第一方支持这些功能,则适用于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>
Run Code Online (Sandbox Code Playgroud)

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

<DataTemplate DataType="{x:Type vm:MyViewModel}" >
   <TextBlock Text="{Binding Text}" 
              d:DataContext="{Binding Source={StaticResource SampleDataSource}}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

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

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

替代

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

这是Karl Shifflett的一篇非常好的文章,其中包括一些这些技术和一些视频:http: //karlshifflett.wordpress.com/2008/10/11/viewing-design-time-data-in-visual-studio -2008-苹果酒设计师在-WPF-和Silverlight的项目/

希望这有帮助,安德森