Я использую Expression Blend 4 и Visual Studio 2010 для создания прототипа Sketchflow.
У меня есть коллекция образцов данных и привязанный к ней 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?