我正在使用 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 本身?