11

WP8 プロジェクトを自作の MVVM 実装から MVVM Light に調整しようとしています。

アプリケーションはエラーなしでコンパイルされますが、Expression Blend で MainPage.xaml を開くと、次のエラーが発生します。

クラス project.Services.INavigationService は既に登録されています。App.xaml

私のViewModelLocator.cs:

    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {

        }
        else
        {
            if (!SimpleIoc.Default.IsRegistered<INavigationService>())
            {
                SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());
            }
        }

        SimpleIoc.Default.Register<MainPage>();
        SimpleIoc.Default.Register<SettingsEditViewModel>();
    }

コードのコメントからわかるように、ここで想定されている修正を既に試しましたが、Blend でまだこのエラーが発生しています。INavigationService を登録できる場所が他にないので、何が問題になるのでしょうか?

何か案は?:)

4

4 に答える 4

18

私は同じ問題を抱えていました。これは、XAML-Designer、静的ファクトリ/ロケーター、およびオブジェクトのデザイン時の作成と組み合わせた Visual Studio の問題のようです。ただし、解決策は次のとおりです。

  1. 工場なしで登録する (非推奨)

    SimpleIoc.Default.Register<INavigationService>();

  2. または、ファクトリを使用する場合は、ファクトリを登録する前に登録を解除します

    SimpleIoc.Default.Unregister<INavigationService>(); SimpleIoc.Default.Register<INavigationService>(() => new NavigationService());

  3. コンストラクターを静的にすることで、デザイナー/ブレンドによって ViewModelLocator が複数回作成されるのを防ぎます。

    static ViewModelLocator() { ... }

エラーは面倒ですが、次のシナリオで発生する可能性があります: デザインタイム (ViewModelLocatorおそらく App.xaml 内) にオブジェクトを作成し、コードで何かを変更するたびに、コンパイラがトリガーされ、ViewModelLocator が登録解除せずに再作成されます。サービス。したがって、工場ですでに登録されていると不平を言うでしょう。理論的には、ファクトリのないクラスを複数回登録すると、エラーも発生するはずです。

于 2015-03-07T14:03:18.367 に答える
0

今ではすでに解決されている可能性がありますが、ファクトリ メソッドのオーバーライドを使用しないことで、この例の問題を解決できると思います。

SimpleIoc.Default.Register<INavigationService, NavigationService>();

ファクトリ メソッドが必要な場合は、これまでのようにデザイン モード チェックを使用して、この行をファクトリ メソッド アプローチと組み合わせることができます。

if (ViewModelBase.IsInDesignModeStatic)
{
    SimpleIoc.Default.Register<INavigationService, NavigationService>();
}
else
{
    SimpleIoc.Default.Register<INavigationService>(CreateNavigationService);
}
于 2014-12-14T17:34:46.017 に答える
0

これは非常に古い質問のように思えますが、何時間ものグーグル検索の後、これが私の問題に似た唯一の質問なので、他の人のためにここで答えます.

ViewModelLocator に IsDataSource があることを確認します。

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />

これで問題が解決し、設計データがすぐに表示されました。

奇妙なことに、それを装着した後、「INavigationService は既に登録されています」というエラーがすべて消えます。

于 2015-01-05T08:08:53.303 に答える