一部の Microsoft アプリケーションの「ウィザード」コンポーネントのように機能するアプリケーションを作成しています。これを表すために、2 つの ViewModel があります。
class WizardVm {
public string Name { get; set; }
public ICommand QuitCommand { get { /* ommitted */ } }
public WizardStepVm CurrentStep { get; set; }
}
class WizardStepVm {
public string StepName { get; set; }
public string StepText {get; set; }
}
ビューでWizardVm
は、ウィンドウにバインドし、ウィンドウWizardStepVm
内のコンテンツ パネルにバインドします。プログラムでコンテンツ コントロールを作成し、次のように WizardView に追加しています。
// in the "DataContextChanged" handler for the WizardView
var bn = new Binding("CurrentStep");
bn.Mode = BindingMode.OneWay;
var contentControl = new ContentControl();
contentControl.SetBinding(ContentControl.ContentProperty, bn);
WizardViewStackPanel.Children.Add(contentControl);
これは、WizardView が最初に作成されたときに正しくレンダリングされます。ただし、CurrentStep
変更された場合、ビューはこれを反映するように更新されません。CurrentStep は変更されますが、ContentControl は引き続き元の WizardStepVm を表示します。また、古い WizardStepVm は引き続きメモリ内に存在し、その文字列プロパティは引き続き (ビューから) 変更できます。
どうしてこれなの?バインドされている ViewModel の変更を反映するようにコンテンツ コントロールを変更するには、どうすればよいですか?
(実際には、これをプログラムで行うのには十分な理由があります。ただし、xaml ソリューションも高く評価されています。)