Предварительный просмотр DataTemplate без x: Key с использованием Expression Blend SampleData, привязанного к ListBox - PullRequest
1 голос
/ 21 февраля 2012

У меня есть следующее созвездие в моем XAML:

<ListBox x:Uid="attributesListBox" 
    DataContext="{Binding Source={StaticResource EditFeatureWithForeignKeyAttributesViewModel}}" ItemsSource="{Binding Path=Attributes}" 
    d:DataContext="{d:DesignData /SampleData/BlendableAttributesSampleData.xaml}">
</ListBox>

Следующий DataTemplate применяется через DataType:

<DataTemplate x:Uid="dataColumnFeatureAttributeDataTemplate" DataType="{x:Type DataColumnFeatureAttribute}">
    <!-- ... opens a button and a grid ... -->
            <TextBlock Text="{Binding EditCaption}" />
    <!-- ... closes button and grid ... -->
</DataTemplate>

Как объяснено здесь вВ разделе «Примечания» x: Key генерируется неявно, и «DataTemplate автоматически применяется к объектам данных этого типа».

Внутри DataTemplate связаны несколько простых свойств элемента списка.В этом отрывке из моего SampleData вы найдете свойство EditCaption, упомянутое выше - это простая строка, и DataContext и ItemsSource ListBox должны соответствовать:

<SampleData:BlendableAttributes xmlns:SampleData="clr-namespace:Commons.Mobile.SampleData">
    <SampleData:BlendableAttributes.Attributes>
        <Mobile_Client:FeatureAttribute DisplayCaption="Vestibulum adipiscing curabitur" DisplayString="Class maecenas parturient" ErrorMessage="Nunc amet aliquam nam sed" EditCaption="Cras phasellus duis" IsEditable="True" IsSearchable="False" IsViewable="True" Modified="False">
            <Mobile_Client:FeatureAttribute.Feature>
                <!-- ... Feature with a lot of properties ...  -->
            </Mobile_Client:FeatureAttribute.Feature>
        </Mobile_Client:FeatureAttribute>
        <!-- ... more FeatureAttributes ... -->
    </SampleData:BlendableAttributes.Attributes>
</SampleData:BlendableAttributes>

DataTemplate правильно применяется в предварительном просмотре,если я ссылаюсь на это через x: Key.В этом случае это невозможно, поскольку список содержит объекты разных типов, поэтому мне нужно использовать неявный x: Key для применения определенного DataTemplate в соответствии с типом объекта.

Таким образом, во время выполнения проблем не возникаетс данными из моей виртуальной машины, но во время разработки

  • Expression Blend показывает SampleData, но без применения DataTemplate при просмотре всей страницы
  • С другой стороны, когдаЯ захожу в Ресурсы и редактирую DataTemplate, вижу макет без SampleData.

Я кое-что опробовал и искал решение на форуме, но, похоже, никто не имел этогоособое созвездие.Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 26 мая 2012

Вы настроили действие по сборке DesignData для файла "/SampleData/BlendableAttributesSampleData.xaml"? Если да, конструктор Visual Studio не создает объект типа DataColumnFeatureAttribute для ваших примеров данных, а вместо этого представляет собой прокси-объект типа _.di0.DataColumnFeatureAttribute (или что-то подобное). Следовательно, ваш DataTemplate не используется, поскольку свойство DataType вашего DataTemplate относится к другому типу, чем тип прокси.

Вы можете изменить действие сборки на DesignDataWithDesignTimeCreatableTypes, чтобы решить эту проблему (для этого необходимо, чтобы класс DataColumnFeatureAttribute имел конструктор по умолчанию).

В качестве альтернативы, если вы не можете использовать DesignDataWithDesignTimeCreatableTypes, установите для свойства d:IsDesignTimeCreatable значение False в вашем DataTemplate, например:

<DataTemplate x:Uid="dataColumnFeatureAttributeDataTemplate" 
              DataType="{x:Type DataColumnFeatureAttribute}" 
              d:IsDesignTimeCreatable="False"> 
    <!-- ... opens a button and a grid ... --> 
            <TextBlock Text="{Binding EditCaption}" /> 
    <!-- ... closes button and grid ... --> 
</DataTemplate> 
...