0

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

我有一个示例数据集合和一个绑定到它的 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 本身?

4

1 回答 1

0

我相信这对你有用,我刚刚用 SL 和 Blend 4 试过:

  1. 不要将您的模板制作成用户控件以将其放入单独的文件中,而是将模板移动到其自己的资源字典中。
  2. 要添加新的资源字典,资源面板右上角有一个按钮。
  3. 在你的用户控件的资源中找到模板(可能默认命名为ItemTemplate),右键复制,粘贴到新的资源字典中。
  4. 删除原始资源,这可能会给你一个关于引用的警告,如果你让它们保持不变,它们可能仍然有效,因为名称将是相同的,如果不是:
  5. 右键单击您的列表框,编辑其他模板、项目模板、应用资源并从新资源字典中选择 ItemTemplate。

现在您的模板在一个单独的文件中,并且应该仍然可以使用数据上下文进行编辑,尽管它不会像数据模板在同一个用户控件中那样出现在画板上。

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

于 2010-06-10T12:43:07.470 回答