Визуализация пользовательского элемента управления с абстрактным базовым классом во время разработки - PullRequest
4 голосов
/ 07 февраля 2011

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

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

Для записи я знаю, что существуют проблемы типа "шаблоны и практики", связанные с наличием этого типа иерархии элементов управления в WPF, но рефакторинг всего проектаВ настоящее время это не вариант.

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

1 Ответ

0 голосов
/ 03 февраля 2012

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

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

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

дизайнер не сможет отобразить.

если YourUserControl требуется какой-либо параметр. самый популярный трюк - создать такой конструктор, как этот

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

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

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

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

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

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

    [ImportingConstructor]
    public MyViewModel(IEventAggregator eventAggregator) //for runtime
    {
        this._eventAggregator = eventAggregator;
        //...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...