如何在设计时将Sketchflow示例数据用于ListBoxItem模板?

时间:2010-06-09 22:41:32

标签: silverlight expression-blend sketchflow sample-data

我正在使用Expression Blend 4和Visual Studio 2010来创建Sketchflow原型。

我有一个Sample Data集合和一个绑定它的ListBox。这显示了我在设计时和运行时所期望的。但是,ListBoxItem模板它足够复杂,我想把它拉出到自己的XAML文件中。即使项目仍然在使用模板的主ListBox中按预期呈现,当我打开模板本身时,所有数据绑定控件都是空的。

如果我将DataContext添加到模板中,我可以在模板中查看和使用填充的对象,但随后该本地DataContext将覆盖列表框上的DataContext集。

一些代码将说明。首先创建一个Sketchflow项目(我使用的是Silverlight,但它应该对WPF起作用),然后添加一个名为SampleDataSource的项目数据源。添加一个名为ListData的集合,其中包含一个名为Title的String属性。

以下是主要Sketchflow屏幕的(按比例缩小)代码,我们称之为Main.xaml:

<UserControl
 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"
 xmlns:local="clr-namespace:DemoScreens"
 mc:Ignorable="d"
 x:Class="DemoScreens.Main"
 Width="800" Height="600">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ProjectDataSources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <DataTemplate x:Key="ListBoxItemTemplate">
             <local:DemoListBoxItemTemplate d:IsPrototypingComposition="True"     Margin="0,0,5,0" Width="748"/>
            </DataTemplate>
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="#5c87b2" DataContext="{Binding Source={StaticResource SampleDataSource}}">
          <ListBox Background="White" x:Name="DemoList" Style="{StaticResource ListBox-Sketch}" Margin="20,100,20,20" ItemTemplate="{StaticResource ListBoxItemTemplate}" ItemsSource="{Binding ListData}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
    </Grid>
</UserControl>

你可以看到它引用了DemoListBoxItemTemplate,它在自己的DemoListBoxItemTemplate.xaml中定义:

<UserControl
 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"
 xmlns:local="clr-namespace:DemoScreens"
 mc:Ignorable="d"
 x:Class="DemoScreens.DemoListBoxItemTemplate">
 <Grid x:Name="LayoutRoot">
  <TextBlock Text="{Binding Title}" Style="{StaticResource BasicTextBlock-Sketch}" Width="150"/>
    </Grid>
</UserControl>

显然,这比我的实际列表框简单,但它应该足以说明我的问题。在表达式设计器中打开Main.xaml时,列表框中将填充示例数据。但是当你打开DemoListBoxItemTemplate.xaml时,没有数据上下文,因此没有要显示的数据 - 这使得在视觉上识别控件变得更加困难。

我在处理模板时如何显示样本数据,同时仍允许将更大的样本数据集用于ListBox本身?

1 个答案:

答案 0 :(得分:0)

我相信这对你有用,我只是尝试用SL和Blend 4:

  1. 而不是将模板制作成 用户控件将其放入 单独的文件,移动模板 进入自己的资源词典。
  2. 要添加新资源字典,资源面板的右上角会有一个按钮。
  3. 在usercontrol的资源中找到模板(默认情况下可能名为ItemTemplate),右键单击它以进行复制,将其粘贴到新的资源字典中。
  4. 删除原始资源,这可能会给你一个关于引用的警告,如果你保留它们可能仍然有效,因为名称将是相同的,如果不是:
  5. 右键单击列表框,编辑其他模板,项目模板,应用资源并从新资源字典中选择ItemTemplate。
  6. 现在你的模板在一个单独的文件中,并且仍然可以使用datacontext进行编辑,尽管它不会像在数据模板位于同一个用户控件中那样在画板上就位。

    希望有所帮助,如果没有,请告诉我。