わかりました、私はこれについて髪を引っ張っていますので、どんな助けも大歓迎です!
MVVM パターンを使用して WPF アプリケーションを構築しています。
設計時にデータを取得するために、Ninject 依存性注入フレームワークをサービス ロケーターと組み合わせて使用しています ( http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspxの記事の例によく似ています)。
(Silverlight ではなく WPF を使用しているため、設計時のプロパティを少し異なる方法でチェックしますが、それ以外は適用可能だと思います)。
バインディングが呼び出されないように見えても、デザイン時に動作させることができません。実行時に問題なく動作します。
私の Ninject モジュールのコードは次のとおりです。
public class ViewModelModule : StandardModule
{
public override void Load()
{
bool isRuntime = !ViewModelBase.IsInDesignMode;
if (isRuntime)
{
Bind<IViewModel>().To<MyViewModel>();
}
else
{
Bind<IViewModel>().To<MyDesignTimeViewModel>();
}
}
}
MyDesignTimeViewModel
のすべての同じプロパティの代わりにハードコードされたデータを返すプレーンな CLR オブジェクトですMyViewModel
。
サービス ロケーターは次のとおりです。
public class ViewModelLocator
{
private static IKernel kernel;
static ViewModelLocator()
{
if (kernel == null)
{
kernel = new StandardKernel(new ViewModelModule());
}
}
public IViewModel ViewModel
{
get
{
var vm = kernel.Get<IViewModel>();
return vm;
}
}
}
そして、XAML は次のようにページの DataContext をバインドします (ただし、いくつかの異なる宣言方法を試しましたが、すべて同じ結果になりました)。
<Page.DataContext>
<Binding Source="{StaticResource viewModelLocator}" Path="ViewModel" />
</Page.DataContext>
(viewModelLocator は、このファイルの先頭にマージされる ResourceDictionary で宣言されます)。
私が言ったように、これは実行時に正常に動作します。実行時に MyDesignTimeViewModel を使用するように Ninject バインディングを切り替えても、ダミー データが正常に表示されます。バインディングの 1 つにダミーのコンバーターがあり、何が渡されるかを確認できます。これは実行時に呼び出されますが、設計時には呼び出されません (別の Visual Studio プロセスを使用して設計時のインスタンスを必死にデバッグしていました。 MSDN の推奨に従ってください!)
設計時には、Ninject バインディングがカーネルのインスタンス化と共に進められます。次に、viewModel が呼び出され、ハードコーディングされたすべてのデータと共に DesignTimeViewModel が返されます。ただし、ビューモデルのプロパティへの実際のバインディングは呼び出されないようです (ダミーのコンバーター ブレークポイントがヒットすることはありません)。
私は自分が間違っていることを本当に見ることができません。この段階では私は困惑しているだけなので、あらゆる方向へのポインタは大歓迎です。ありがとう :)