2011-02-07 11 views
4

Я работаю над проектом, который имеет несколько пользовательских элементов управления WPF, которые наследуются от абстрактного базового класса (самого себя на основе UserControl). Эти элементы управления отображаются просто во время выполнения, но они не отображаются в дизайнере.Оказание контроля пользователя с абстрактным базовым классом во время разработки

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

Для записи я знаю, что существуют проблемы с шаблонами «шаблоны &» с наличием такого типа иерархии управления в WPF, но в настоящее время реорганизация всего проекта не является вариантом.

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

ответ

0

во время разработки Visual Studio попытается создать новый Instant YourSerControl с без параметров конструктор.

, если вы не можете создать UserControl мгновенным, как этот

var myView = new MyUserControl(); //no params 

дизайнер не сможет вынести.

Если для вашего устройства UserUserControl требуется какой-либо параметр. самая популярная Хитрость заключается в том, чтобы создать конструктор посвятить как этот

public MyUserControl() : 
    this(new MockViewModel(), new MockDataContext){ } // mock Designtime constructor 

puclic MyUserControl(IViewModel vm, IDataContext context) //runtime constructor 
{ 
} 

в MVVM шаблон некоторых UserControl.DataContext является определенный пользователем тип, который требуется некоторое Params XAML

<UserControl.DataContext> 
    <local:MyViewModel /> 
</UserControl.DataContext> 

Вы должны определить конструктор без параметров для среды разработки.

public MyViewModel() : this(new MockEventAggregator()) //for designtime 
    { } 

    [ImportingConstructor] 
    public MyViewModel(IEventAggregator eventAggregator) //for runtime 
    { 
     this._eventAggregator = eventAggregator; 
     //... 
    } 
Смежные вопросы