2011-02-07 57 views
4

我正在處理一個項目,該項目有幾個從抽象基類(基於UserControl自身)繼承的WPF用戶控件。這些控件在運行時渲染得很好,但它們不會在設計器中渲染。在設計時渲染具有抽象基類的用戶控件

我收集到這種情況是因爲設計者試圖創建一個xaml根元素的實例,在這種情況下是我的基類,但它不能創建一個實例,因爲它是抽象的。

爲了記錄,我知道有「模式&實踐」類型的問題與WPF中的這種類型的控制層次結構,但重構整個項目目前不是一個選項。

我的問題是這樣的:我知道有設計時間屬性來設置DataContext,DesignWidth等。我想知道的是,你可以給一個「設計時間」實例或類型來提供作爲替代當控件在設計器中加載時?

回答

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是需要一些PARAMS XAML

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

必須定義參數的構造函數用戶定義類型爲設計時環境。

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

    [ImportingConstructor] 
    public MyViewModel(IEventAggregator eventAggregator) //for runtime 
    { 
     this._eventAggregator = eventAggregator; 
     //... 
    }