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 がありません。

エラー

ここに画像の説明を入力

4

1 に答える 1

1

C# では、抽象クラスはパブリック コンストラクターを持つことができず、抽象規則に違反しています。

ここで MSDN を参照してください http://msdn.microsoft.com/en-us/library/ms182126(v=vs.100).aspx

MSDN からのルールの説明:

抽象型のコンストラクターは、派生型によってのみ呼び出すことができます。パブリック コンストラクターは型のインスタンスを作成し、抽象型のインスタンスは作成できないため、パブリック コンストラクターを持つ抽象型は正しく設計されていません。

したがって、この方法で保護されている抽象クラスでコンストラクターを使用できます

public abstract class ViewBase : UserControl
{
    protected ViewBase()
    {
于 2012-07-22T16:18:47.050 に答える