Какие подходы доступны для фиктивных данных времени разработки в 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 #».

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

  • WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
  • Что означает «{Binding Path =.}» В привязке WPF?
  • Почему привязка данных WPF к исключению ласточки?
  • Каковы различные режимы привязки WPF?
  • Можно ли связать свойство Canvas's Children в XAML?
  • Перетаскивание из источника данных в окно WPF не работает
  • WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
  • Связывающие свойства в коде
  • Обнаружение ошибок проверки WPF
  • Когда следует использовать # и = в элементах управления ASP.NET?
  • WPF перед записью
  • Давайте будем гением компьютера.