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

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

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

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

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

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

1. Как я могу использовать привязки времени разработки коллекций и нетривиальных данных в конструкторе visual studio XAML, а затем плавно переключаться на привязки среды выполнения?

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

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

7 ответов


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

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

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

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

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

работает достаточно хорошо.


как сплав принятого ответа Горана и превосходного комментария Рене.

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

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


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

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

Laurent Bugnion имеет аналогичный подход, который фокусируется на смешивании выражений. Это может работа для VS2010, но я еще не подтвердил это.

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


возможно, новые функции времени разработки Visual Studio 2010 и Expression Blend 4 являются вариантом для вас.

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


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

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

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

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
    }       
}

используя Visual Studio 2017, я пытался следовать всем руководствам и таким вопросам, как это, и я все еще сталкивался с <ItemsControl> который просто не выполнил код, который у меня был внутри конструктора DesignFooViewModel, который наследует от FooViewModel. Я подтвердил, что" не выполнил " часть после этого "удобный" MSDN руководство (спойлер: MessageBox отладка). Хотя это напрямую не связано с первоначальным вопросом, я надеюсь, что это спасет других много время.

оказывается, я не делал ничего плохого. Вопрос в том, что мое приложение должно быть построено для 64. Как Visual Studio по-прежнему в 2018 32-разрядный процесс и, по-видимому, не может вращать 64-разрядный хост-процесс для части конструктора, он не может использовать мои классы x64. Действительно плохо то, что в любом журнале, который я мог бы придумать, нет ошибок.

так что если вы наткнетесь на этот вопрос, потому что вы видите фиктивных данных в вашей конструкции время просмотр модели (например:<TextBlock Text="{Binding Name}"/> появляется Name независимо от того, что вы установили свойство) причиной, скорее всего, будет ваша сборка x64. Если вы не можете изменить конфигурацию сборки на anycpu или x86 из-за зависимостей, подумайте о создании нового проекта, который полностью является anycpu и не имеет зависимостей (или каких-либо зависимостей). Таким образом, вы в конечном итоге разделяете большинство или все, кроме частей инициализации кода, из вашего проекта "WPF App" в " библиотеку классов C# " проект.

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


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

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

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