设计时间视图不显示

问题描述:

我建立了一个小视图定位器。设计时间视图不显示

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

在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