Подтвердить что ты не робот

Создание совместимости с DataTemplate

Как я могу создать Datatemplate для blendable ViewModel (обозначаемого в blend-выражении). Когда я перехожу к ресурсам и пытаюсь редактировать DataTemplate непосредственно все, что я вижу на Drawingborad, это пустой прямоугольник. Это связано с тем, что DataTemplate не привязан ни к чему. Конечно, я могу создать UserControl и создать некоторые данные времени разработки в коде там, чтобы увидеть шаблон, но теперь мне придется переключаться между ресурсами (для редактирования) и usercontrol (чтобы увидеть результат моего редактирования). Нет ли более прямого способа редактирования и просмотра моего DataTemplate?

4b9b3361

Ответ 1

Это немного для использования, но у Blend есть функция, называемая "Design-Time Data", которая может вам помочь. Сначала сложно начать работу, но как только вы сделаете несколько, это довольно легко. Это как-то заставляет вас использовать хороший шаблон для DataContext.

Здесь хорошая ссылка на эту тему: http://www.robfe.com/2009/08/design-time-data-in-expression-blend-3/

Вот несколько выдержек выбора:

О размерах времени разработки

... свойства времени проектирования могут быть безопасно игнорируются другими инструментами, и они игнорируются во время выполнения (mc: Ignorable указывает, что пространство имен с префиксом "d" может быть игнорируется).

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 mc:Ignorable="d"

Expression Blend использует два времени разработки свойства (d: DesignWidth, d: DesignHeight), чтобы указать размер для элемент управления, который будет использоваться во время разработки...

В источниках времени разработки

Я наткнулся на d: Datacontext, когда я играла с Blend 3 и пыталась добавление "живого источника данных" к моему окно. Я думал, это будет ведут себя так же, как старый способ установка DataContext, но когда я побежал моей заявки, данных не было!...

Итак, теперь мы можем написать код вроде этого:

...
<Grid ...
      DataContext="{StaticResource GameDataSource}"
      d:DataContext="{StaticResource DesignTime_DateDataSource}">

Обратите внимание, что это для Blend 3, если вы хотите получить поддержку сторонних разработчиков. Они довольно хороши - даже дизайнер для данных времени разработки, хотя я еще не изучал эти функции.

Применение к DataTemplates

Это то, что я соделал, но, похоже, работает. Здесь я использую функцию данных "Время разработки", чтобы вытащить данные в визуальный элемент d: DataContext. Вы должны сделать это для каждого элемента верхнего уровня, которому нужен набор DataContext.

<ResourceDictionary
    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"
    mc:Ignorable="d">
    <!-- Resource dictionary entries should be defined here. -->
    <DataTemplate x:Key="MyTemplate">
        <TextBlock Text="{Binding Text}" d:DataContext="{StaticResource SampleDataSource}" />
    </DataTemplate>
</ResourceDictionary>

Синтаксис привязки немного более явный, если вы используете DataTemplate с набором DataType, но он все еще работает:

<DataTemplate DataType="{x:Type vm:MyViewModel}" >
   <TextBlock Text="{Binding Text}" 
              d:DataContext="{Binding Source={StaticResource SampleDataSource}}" />
</DataTemplate>

Эта стратегия позволит вам увидеть, как DataTemplate будет работать при прямом редактировании, но вы не сможете увидеть результат на любом представлении, которое использует этот DataTemplate, если вы фактически не запускаете приложение. Это ограничение Blend на данный момент из-за того, что они, похоже, не используют Mocks, а скорее полные объекты замены. Если смесь когда-либо добавляет возможность создать новый поддельный источник данных, нажав "Новый источник данных → на основе ссылочного объекта → MyCustomerObject", вы будете в бизнесе.

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

Alternative

Альтернатива, которая будет работать в любой ситуации, но немного более громоздка для настройки, - это установка StaticResources, которая заменяет поддельные данные для реальных данных во время выполнения, но в конструкторе показывают статические данные образца.

Здесь действительно замечательная статья Карла Шиффлетта, которая включает в себя некоторые из этих методов и несколько видеороликов на нем: http://karlshifflett.wordpress.com/2008/10/11/viewing-design-time-data-in-visual-studio-2008-cider-designer-in-wpf-and-silverlight-projects/

Надеюсь, это поможет, Андерсон

Ответ 2

Эта стратегия позволит вам увидеть как DataTemplate будет работать в то время как редактируя его напрямую, однако вы не будете видеть результат в любом представлении который использует этот DataTemplate, если только вы фактически запускаете приложение. Это ограничение Blend на момент к тому, что они не появляются использовать Mocks, но скорее завершить заменяющие объекты. Если смесь когда-либо добавляет возможность создания новой подделки источника данных, нажав "Новый DataSource → Основано на ссылках Объект → MyCustomerObject", то вы будет в бизнесе.

Если я хочу использовать acutal ViewModel mocks, я думаю, что это лучший способ создать реальные экземпляры ViewModel и ссылки на них с помощью d: DataContext (например, с помощью ObjectDataProvider или x: Static)