Как использовать образцы данных Sketchflow для шаблона ListBoxItem во время разработки? - PullRequest
0 голосов
/ 10 июня 2010

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

1 Ответ

0 голосов
/ 10 июня 2010

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

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

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

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

...