在设计时使用抽象基类渲染用户控件

时间:2011-02-07 19:03:48

标签: wpf visual-studio xaml

我正在开发一个项目,它有几个WPF用户控件,它继承自抽象基类(本身基于UserControl)。这些控件在运行时渲染得很好,但它们不会在设计器中渲染。

我认为发生这种情况是因为设计者试图创建xaml根元素的实例,在本例中是我的基类,但它不能创建实例,因为它是抽象的。

为了记录,我知道在WPF中存在这种类型的控制层次结构存在“模式和实践”类型问题,但是当前不能重构整个项目。

我的问题是:我知道设置DataContext,DesignWidth等有设计时属性。我想知道的是,你能否给出一个“设计时”实例或类型作为替换时提供控件是否加载到设计器中?

1 个答案:

答案 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
{ 
}
在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;
        //...
    }