Windows Phoneアプリケーションでは、BookProgressInfo
クラスのインスタンスにデータバインドされたカスタムユーザーコントロールがあります。デフォルト以外のコンストラクタを使用してビューモデルの依存関係を挿入する
<deusControls:BookProgressBar BookProgressValue="{Binding BookProgressInfo}" Width="430" />
たびBookProgressInfo
変更、
static void BookProgressValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var bookProgressBar = (BookProgressBar)sender;
var progressInfo = (BookProgressInfo) e.NewValue;
if(progressInfo != null && progressInfo.Id != 0)
bookProgressBar.ProgressBarListBox.DataContext = new BookProgressBarViewModel(progressInfo, bookProgressBar.Width);
}
が呼び出されます。私はbookProgressBar.ProgressBarListBox
に新しいDataContextを設定するたびに、コントロール全体のバウンドプロパティが変更されます。
私は以前はBookProgressBarViewModelを1つしか持っていなかったので、上記のスニペットに実装されているようにすべてうまく動作しました。
今私は別のBookProgressBarViewModel
をサポートしたいので、インターフェース - IBookProgressBarViewModelを導入しました。
ご覧のとおり、BookProgressBarViewModel
のコンストラクタにはパラメータがあります。
私はIinCコンテナとしてNinjectカーネルを使用しており、App.xamlで起動します。
BookProgressValueChanged
のIoCコンテナに対応するIBookProgressBarViewModel
のインスタンスを作成するにはどうすればよいですか?
更新:私は依存関係プロパティ変更イベントハンドラ内からパラメータ化されたビューモデルコンストラクタを呼び出す必要がないようにアーキテクチャを変更しました。それでも私はこの質問についてあなたの提案を聞きたいと思います。
私はNinjectがあなたが登録し、必要なパラメータを登録することを可能にすると思います。それとも問題なのですか?私はここでポイントを逃しているかもしれないと思う。 – Vitalij
@Vitalij、 'NinjectModule'では、依存関係のコンストラクタにパラメータを渡したり、メソッドにデリゲートを渡してこれらのパラメータを計算することさえできます。しかし、私の場合、ビューが必要になるまで値は分かりません。これらのインスタンスを前面に生成する方法はありません。しかし、今はクラス 'viewModelParametersProvider'を持つことができ、依存関係が必要なときに、Ninjectモジュールの初期化メソッドからそのルーチンを呼び出すことができると思います。 –