Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

WPF дизайнер ругается на отсутствие конструктора по умолчанию

#c_sharp #net #wpf #mvvm #wpf_blendability


Когда для дизайнера указываю в DataContext VM-ку у которой нет конструктора по умолчанию
то он всегда на это ругается. Как можно исправить эту ситуацию?

d:DataContext="{d:DesignInstance local:AuthenticationVm,
                                          IsDesignTimeCreatable=True}"



    


Ответы

Ответ 1



Если у вас указано IsDesignTimeCreatable=True, дизайнер WPF попытается создать объект этого класса, и использовать в качестве DataContext для отображения. Для этого ему нужен конструктор без параметров. Если у вас указано IsDesignTimeCreatable=False, дизайнер WPF не будет пытаться создать объект. Вместо этого он создаст свой фейковый тип данных с такими же открытыми свойствами, инстанциирует его, и будет использовать в качестве DataContext'а. Когда вы указываете IsDesignTimeCreatable=False, вы больше не будеет видеть в дизайнере данные. Это может быть не очень удобно. Вот более продвинутый способ, который позволяет видеть данные в дизайнере даже если у вашей VM нет конструктора без аргументов. Для этого нужно создать данные для дизайнера. Допустим, у нас есть такой VM-класс: class VM { public VM(string text) { Text = text; } public string Text { get; } } Как мы видим, у этого класса нет конструктора без параметров, и у его свойства нету сеттера. Это нам не помеха. Заводим в проекте ResourceDictionary (пусть он называется DesignDictionary.xaml, точное название не важно). Когда вы его создадите, он будет выглядеть как-то так: Удалите всё это (!) и положите вместо него объявление экземпляра вашего VM-класса: Теперь зайдите в свойства файла, и задайте ему Build Action = DesignData и удалите Custom Tool: Теперь этот экземпляр можно использовать следующим образом: Не забудьте перекомпилировать проект. Теперь в дизайнере отображаются данные: Всё, мы обошли ограничения дизайнера WPF. Литература: MSDN/WPF Designer blog/Sample Data in the WPF and Silverlight Designer. Ещё одной идеей для борьбы с проблемой может быть создание специального производного класса (только для использования в дизайнере), в котором будет конструктор по умолчанию. Этот конструктор будет вызывать базовый конструктор с какими-нибудь подходящими параметрами. Чтобы случайно не использовать этот класс в реальном коде, можно дать ему атрибут [Obsolete].

Комментариев нет:

Отправить комментарий