Представление времени разработки не отображается

Я построил небольшой локатор видов.

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 во время разработки.

Ошибка

введите здесь описание изображения


person deanvmc    schedule 22.07.2012    source источник


Ответы (1)


В абстрактном классе С# не может быть общедоступного конструктора, что является нарушением абстрактного правила.

См. MSDN здесь http://msdn.microsoft.com/en-us/library/ms182126(v=vs.100).aspx

Описание правила из MSDN:

Конструкторы абстрактных типов могут вызываться только производными типами. Поскольку общедоступные конструкторы создают экземпляры типа, а экземпляры абстрактного типа создавать нельзя, абстрактный тип, имеющий общедоступный конструктор, спроектирован неправильно.

Таким образом, вы можете использовать конструктор в своем абстрактном классе как защищенный таким образом.

public abstract class ViewBase : UserControl
{
    protected ViewBase()
    {
person HatSoft    schedule 22.07.2012
comment
Это устраняет проблему, но привязка не работает. Я задам еще один вопрос, поскольку они не кажутся связанными. Спасибо! - person deanvmc; 22.07.2012