我正在开发一个项目,它有几个WPF用户控件,它继承自抽象基类(本身基于UserControl)。这些控件在运行时渲染得很好,但它们不会在设计器中渲染。
我认为发生这种情况是因为设计者试图创建xaml根元素的实例,在本例中是我的基类,但它不能创建实例,因为它是抽象的。
为了记录,我知道在WPF中存在这种类型的控制层次结构存在“模式和实践”类型问题,但是当前不能重构整个项目。
我的问题是:我知道设置DataContext,DesignWidth等有设计时属性。我想知道的是,你能否给出一个“设计时”实例或类型作为替换时提供控件是否加载到设计器中?
答案 0 :(得分:0)
在设计时,Visual Studio将尝试创建新的YourUserControl Instant 使用无参数构造函数。
如果你不能像这样创建usercontrol即时
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
{
}
<UserControl.DataContext>
<local:MyViewModel />
</UserControl.DataContext>
您必须为设计时环境定义无参数构造函数。
public MyViewModel() : this(new MockEventAggregator()) //for designtime
{ }
[ImportingConstructor]
public MyViewModel(IEventAggregator eventAggregator) //for runtime
{
this._eventAggregator = eventAggregator;
//...
}