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

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

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

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

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

Поэтому мои вопросы:

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

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

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

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

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

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

        
  • Настройка контекста данных времени разработки

      

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

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

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

  • Сопоставьте свой контекст данных времени разработки с кодом.

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

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

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

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

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

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

Я использую этот подход для генерации данных времени разработки с помощью .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 } } 

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

    

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

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

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

Поэтому, если вы наткнетесь на этот вопрос, потому что вы видите фиктивные данные с вашей моделью времени просмотра дизайна (например: показывает Name независимо от того, задаете ли вы свойство), причина вероятно, будет вашей сборкой x64. Если вы не можете изменить конфигурацию сборки на anycpu или x86 из-за зависимостей, подумайте о создании нового проекта, который полностью anycpu и не имеет зависимостей (или любых зависимостей). Таким образом, вы в конечном итоге разбиваете большинство или все, кроме частей инициализации кода, вдали от вашего проекта «WPF App» в проект «Библиотека classов C #».

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

  • Привязка OneWayToSource от свойства readonly в XAML
  • Можно ли связать свойство Canvas's Children в XAML?
  • Для чего нужен DataContext?
  • WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • Нажатие свойств GUI только для чтения обратно в ViewModel
  • Почему привязка данных WPF к исключению ласточки?
  • Связывание WPF ComboBox с пользовательским списком
  • Как правильно привязать xml к WPF DataGrid?
  • Обнаружение ошибок проверки WPF
  • Заполнить Combobox из базы данных
  • Interesting Posts

    Как читать файл из res / raw по имени

    setMaxResults для annotations Spring-Data-JPA?

    Программное обеспечение для преобразования CHM-файлов в EPUB / Kindle

    Каков видеоформат для архивирования видео для длительного хранения?

    В Excel я вставил кучу URL-адресов, но они не являются живыми ссылками – как я могу преобразовать их в живые ссылки?

    Как инициализировать поля структуры, которые ссылаются друг на друга

    Ядро Linux – не могу получить доступ к sda16 & sda17

    PDF-переупорядочение страницы с помощью itext

    Должен ли я войти в Windows при использовании xbootmgr для ускорения загрузки?

    Как получить цвет пикселя в X, Y, используя c #?

    Заводской шаблон в C #: Как обеспечить, чтобы экземпляр объекта мог быть создан только фабричным classом?

    Ковариация Java

    Разница между java.util.Random и java.security.SecureRandom

    создавая «радарную диаграмму» (также называемую сюжетной звездой, участок паука) с использованием ggplot2 в R

    Неправильно ли использовать Диспетчер в моей модели ViewModel?

    Давайте будем гением компьютера.