设计时间视图不显示
问题描述:
我建立了一个小视图定位器。设计时间视图不显示
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。
的错误
答
在C#中抽象类不能有一个公共constuctor,是抽象的规则的违反
请参阅MSDN这里http://msdn.microsoft.com/en-us/library/ms182126(v=vs.100).aspx
从MSDN规则说明:
抽象类型的构造函数只能由派生类型调用。 因为公共构造函数创建一个类型的实例,并且不能创建抽象类型的实例,所以具有 公共构造方法的抽象类型的设计不正确。
所以,你可以使用构造器中你abstrat类作为保护这样
public abstract class ViewBase : UserControl
{
protected ViewBase()
{
此修复该问题,但结合不起作用。我会问另一个问题,因为他们似乎没有关系。谢谢! – deanvmc 2012-07-22 16:25:07