在设计时使用抽象基类呈现用户控件

Jas*_*son 5 wpf xaml visual-studio

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

我认为这是因为设计者试图创建 xaml 根元素的实例,在本例中是我的基类,但它无法创建实例,因为它是抽象的。

作为记录,我知道在 WPF 中使用这种类型的控件层次结构存在“模式和实践”类型的问题,但目前无法重构整个项目。

我的问题是:我知道有用于设置 DataContext、DesignWidth 等的设计时属性。我想知道的是,您能否提供一个“设计时”实例或类型作为控件的替代品提供在设计器中加载?

aif*_*rfa 0

在设计时,Visual Studio 将尝试使用无参数构造函数创建新的 YourUserControl 实例。

如果你不能像这样创建用户控件即时

var myView = new MyUserControl(); //no params
Run Code Online (Sandbox Code Playgroud)

设计师将无法渲染。

如果 YourUserControl 需要任何参数。最流行的技巧是创建像这样的专用构造函数

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

puclic MyUserControl(IViewModel vm, IDataContext context) //runtime constructor
{ 
}
Run Code Online (Sandbox Code Playgroud)

在 MVVM 模式中,某些 UserControl.DataContext 是用户定义的类型,需要一些参数 XAML

<UserControl.DataContext>
    <local:MyViewModel />
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)

必须为设计时环境定义无参数构造函数。

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

    [ImportingConstructor]
    public MyViewModel(IEventAggregator eventAggregator) //for runtime
    {
        this._eventAggregator = eventAggregator;
        //...
    }
Run Code Online (Sandbox Code Playgroud)