Как использовать образцы данных Sketchflow для шаблона ListBoxItem во время разработки?

Я использую 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?


person Community    schedule 09.06.2010    source источник


Ответы (1)


Я считаю, что это должно сработать для вас, я только что попробовал это с SL и Blend 4:

  1. Вместо того, чтобы превращать ваш шаблон в пользовательский элемент управления, чтобы поместить его в отдельный файл, переместите шаблон в его собственный словарь ресурсов.
  2. Чтобы добавить новый словарь ресурсов, есть кнопка в правом верхнем углу панели ресурсов.
  3. Найдите шаблон (по умолчанию он может называться ItemTemplate) в ресурсах вашего пользовательского элемента управления, щелкните его правой кнопкой мыши, чтобы скопировать, вставьте его в новый словарь ресурсов.
  4. Удалите исходный ресурс, это, скорее всего, даст вам предупреждение о ссылках, если вы оставите их такими же, они все равно могут работать, потому что имена будут такими же, в противном случае:
  5. Щелкните правой кнопкой мыши свой список, отредактируйте дополнительные шаблоны, шаблон элементов, примените ресурс и выберите ItemTemplate из нового словаря ресурсов.

Теперь ваш шаблон находится в отдельном файле и по-прежнему должен быть доступен для редактирования с помощью контекста данных, хотя его не будет на монтажной области, как если бы шаблон данных находился в том же пользовательском элементе управления.

Надеюсь, это поможет, дайте мне знать, если это не так.

person Community    schedule 10.06.2010
comment
Спасибо, я попробовал это предложение, но в итоге получил очень похожий результат: любой контекст данных, который я установил для ресурса (чтобы я мог видеть во время разработки, как размещается содержимое), переопределяет текст, установленный для окна списка (который я хочу видеть во время выполнения). Однако я ценю подробный ответ! - person Boris Nikolaevich; 15.06.2010
comment
Вам не нужен отдельный текст для ресурса, он должен наследовать тот, из которого он редактируется. - person Chuck Hays; 16.06.2010