Какие подходы доступны для фиктивных данных времени разработки в WPF?

Я работаю без выражения blend и просто использую редактор XAML в vs2010. Суть этого в стороне, я все чаще вижу необходимость привязки данных времени разработки. Для простых случаев свойство FallbackValue работает очень хорошо (текстовые поля и текстовые блоки и т.д.). Но особенно при работе с ItemsControl и т.д., Действительно нужно, чтобы образцы данных были видимыми в дизайнере, чтобы вы могли настраивать и настраивать элементы управления и шаблоны данных без необходимости запуска исполняемого файла.

Я знаю, что ObjectDataProvider допускает привязку к типу и, таким образом, может предоставлять данные времени разработки для визуализации, но тогда есть некоторая жонглирование, позволяющая связать реальные данные во время выполнения без потери ресурсов путем загрузки загружая как время разработки, фиктивные данные, так и привязки во время выполнения.

На самом деле я хочу, чтобы способность, скажем, "Джон", "Пол", "Джордж" и "Ринго" появиться в дизайне XAML как стильные элементы в моем ItemsControl, но имеют реальную данные появляются при запуске приложения.

Я также знаю, что Blend позволяет использовать некоторые причудливые атрибуты, которые определяют данные привязки времени проектирования, которые WPF игнорируют во время выполнения.

Итак, мои вопросы:

1. Как я могу использовать привязку времени создания коллекций и нетривиальные данные в дизайнере XAML визуальной студии и затем плавно менять привязки к runtime?

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

3. Являются ли их альтернативы сочетанию выражений, которые я мог бы использовать для интегрированного в данные XAML-дизайна? (я знаю, что есть некоторые альтернативы, но я специально хочу, чтобы я мог использовать и видеть связанные данные образца и т.д.?)

Ответ 1

Используя VS2010, вы можете использовать атрибуты Design-Time (работает как для SL, так и для WPF). У меня обычно есть макет источника данных, так что это просто вопрос:

  • Добавление объявления пространства имен

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    
  • Добавление контекста макетных данных в ресурсы окна/управления

    <UserControl.Resources>
      <ViewModels:MockXViewModel x:Key="DesignViewModel"/>
    </UserControl.Resources>
    
  • Настройка контекста данных времени разработки

    <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ...
    

Хорошо работает.

Ответ 2

Карл Шиффлетт описывает подход, который должен работать одинаково хорошо для VS2008 и VS2010:

Просмотр данных времени разработки в дизайнере Cider Designer в проектах WPF и Silverlight

Лоран Бугнион имеет аналогичный подход, который фокусируется на Expression Blend. Это может работать для VS2010, но я еще не подтвердил это.

Имитация данных в режиме разработки в Microsoft Expression Blend

Ответ 3

Возможно, для вас доступны новые возможности дизайна для Visual Studio 2010 и Expression Blend 4.

Как это работает, показано в примере BookLibrary приложения WPF Application Framework (WAF). Загрузите версию .NET4.

Ответ 4

Как амальгама Горана приняла ответ, и Рене отлично комментировал.

  • Добавьте объявление пространства имен. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • Ссылка на контекст данных времени разработки из кода.
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...

Ответ 5

Я использую этот подход для генерации данных времени разработки с помощью .NET 4.5 и Visual Studio 2013.

У меня есть только один ViewModel. Модель представления имеет свойство IsInDesignMode, которое указывает, активен ли режим разработки или нет (см. Класс ViewModelBase). Затем вы можете настроить свои данные времени разработки (например, заполнить элемент управления элементами) в конструкторе моделей представлений.

Кроме того, я бы не загружал реальные данные в конструкторе моделей представлений, это может привести к проблемам во время выполнения, но настройка данных для времени разработки не должна быть проблемой.

public abstract class ViewModelBase
{
    public bool IsInDesignMode
    {
        get
        {
            return DesignerProperties.GetIsInDesignMode(new DependencyObject());
        }
    }
}

public class ExampleViewModel : ViewModelBase
{
    public ExampleViewModel()
    {
        if (IsInDesignMode == true)
        {
            LoadDesignTimeData();
        }
    }

    private void LoadDesignTimeData()
    {
        // Load design time data here
    }       
}

Ответ 6

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

<d:UserControl.DataContext>
    <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" />
</d:UserControl.DataContext>

Это позволяет избежать использования UserControl.Resources. Ваше статическое свойство может функционировать как factory, позволяющее создавать нетривиальные типы данных - например, если у вас нет значения по умолчанию ctor, вы можете вызвать factory или контейнер здесь, чтобы ввести соответствующие зависимости.