Я использую Expression Blend 4 и Visual Studio 2010 для создания прототипа Sketchflow.
У меня есть коллекция Sample Data и связанный с ней ListBox. Это отображается так, как я ожидал, как во время разработки, так и во время выполнения. Однако шаблон ListBoxItem достаточно сложен, чтобы я захотел вытащить его в отдельный файл XAML. Несмотря на то, что элементы по-прежнему отображаются должным образом в основном ListBox, где используется шаблон, когда я открываю сам шаблон, все элементы управления привязкой к данным пусты.
Если я добавлю DataContext в шаблон, я могу видеть и работать с заполненными объектами, находясь в шаблоне, но тогда этот локальный DataContext переопределяет DataContext, установленный в списке.
Это проиллюстрирует небольшой фрагмент кода. Начните с создания проекта Sketchflow (я использую Silverlight, но он должен работать так же для WPF), затем добавьте источник данных проекта под названием SampleDataSource. Добавьте коллекцию с именем ListData с единственным свойством String с именем Title.
Вот (в уменьшенном масштабе) код для основного экрана 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?