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

5
我正在处理一个项目,其中有几个WPF用户控件继承自抽象基类(本身基于UserControl)。这些控件在运行时呈现得很好,但在设计器中无法呈现。
我了解到这是因为设计器试图创建XAML根元素的实例,在这种情况下是我的基类,但它无法创建实例,因为它是抽象的。
值得一提的是,我知道在WPF中拥有这种类型的控件层次结构存在“模式与实践”类型的问题,但当前重构整个项目不是可行的选项。
我的问题是:我知道可以使用设计时属性来设置DataContext、DesignWidth等。我想知道的是,是否可以在设计器中加载控件时提供一个“设计时”实例或类型作为替代?
1个回答

0

在设计时,Visual Studio 将尝试使用无参数构造函数创建 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;
        //...
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接