我正在创建一个应用程序,其工作方式类似于某些 Microsoft 应用程序的“向导”组件。为了表示这一点,我有两个 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 解决方案也受到赞赏。)