2012-07-22 81 views
0

我建立了一個小視圖定位器。設計時間視圖不顯示

public abstract class ViewModelLocatorBase : IViewModelLocator 
{ 
    private readonly static bool isExecutingInDesignMode = 
           DesignMode.DesignModeEnabled; 

    public IViewModel ViewModel 
    { 
     get { return isExecutingInDesignMode 
        ? LocateDesignTimeViewModel() 
        : LocateRuntimeViewModel(); } 
    } 

    protected abstract IViewModel LocateDesignTimeViewModel(); 

    protected abstract IViewModel LocateRuntimeViewModel(); 

} 

這是用來構建更爲具體的觀點定位的

public class UserEditorViewModelLocator : ViewModelLocatorBase 
{ 
    protected override IViewModel LocateDesignTimeViewModel() 
    { 
     return new UserEditorViewModelDesignTime(); 
    } 

    protected override IViewModel LocateRuntimeViewModel() 
    { 
     return new UserEditorViewModelRunTime(); 

    } 
} 

這些都是使用我的意見,以找到正確的視圖模型

public abstract class ViewBase : UserControl 
{ 
    public ViewBase() 
    { 
     BindViewModelLocatorToView(viewModelLocator: GetViewModelLocator()); 
    } 

    protected abstract IViewModelLocator GetViewModelLocator(); 

    protected void BindViewModelLocatorToView(IViewModelLocator viewModelLocator) 
    { 
     if (viewModelLocator != null) 
     { 
      DataContext = viewModelLocator.ViewModel; 
     } 
    } 
} 

通過在提供正確的觀點定位器(最終通過IoC注入)

public sealed partial class UserEditorScreen : ViewBase 
{ 
    public UserEditorScreen() 
    { 
     this.InitializeComponent(); 
    } 

    protected override IViewModelLocator GetViewModelLocator() 
    { 
     return new UserEditorViewModelLocator(); 
    } 
} 

現在,這一切都可以在運行時完美運行,但在設計時,視圖因爲調用BindViewModelLocatorToView而中斷。我一直在Xaml中使用這些視圖定位器作爲StaticResources,所以它們似乎在設計時就以這種方式工作,但自從在視圖構造函數中填充DataContext的更改以來,我缺少設計時ViewModel。

的錯誤

enter image description here

回答

1

在C#中抽象類不能有一個公共constuctor,是抽象的規則的違反

請參閱MSDN這裏http://msdn.microsoft.com/en-us/library/ms182126(v=vs.100).aspx

從MSDN規則說明:

抽象類型的構造函數只能由派生類型調用。 因爲公共構造函數創建一個類型的實例,並且不能創建抽象類型的實例,所以具有 公共構造方法的抽象類型的設計不正確。

所以,你可以使用構造器中你abstrat類作爲保護這樣

public abstract class ViewBase : UserControl 
{ 
    protected ViewBase() 
    { 
+0

此修復該問題,但結合不起作用。我會問另一個問題,因爲他們似乎沒有關係。謝謝! – deanvmc 2012-07-22 16:25:07