我正在使用WPF和MVVM,并具有一个支持故障单窗口,该窗口具有级联ComboBox
es,如下所示。第一个绑定到视图模型上的ObservableCollection<ProblemCode>
。 ProblemCode
对象对其子代码具有自引用属性,最多可包含四个代码。 ComboBox
的XAML如下所示(为简化起见,仅显示了三个)...
<ComboBox ItemsSource="{Binding ElementName=Root, Path=DataContext.ProblemCodes, Mode=TwoWay}"
Name="ProblemCodeLevel1"
DisplayMemberPath="Description"
SelectedValuePath="ID"
SelectedValue="{Binding ProblemCode1ID, Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding ElementName=ProblemCodeLevel1, Path=SelectedItem.Children}"
Name="ProblemCodeLevel2"
DisplayMemberPath="Description"
SelectedValuePath="ID"
SelectedValue="{Binding ProblemCode2ID, Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding ElementName=ProblemCodeLevel2, Path=SelectedItem.Children}"
Name="ProblemCodeLevel3"
DisplayMemberPath="Description"
SelectedValuePath="ID"
SelectedValue="{Binding ProblemCode3ID, Mode=TwoWay}" />
当我加载新票证的窗口时,第一个ComboBox
已正确填充。选择一个项目将填充第二个项目,依此类推。保存票证时,数据已正确保存。
但是,当我保存故障单并重新打开窗口时,只有第一个ComboBox
具有选定的项目集。其他ComboBox
个没有设置任何内容。
我猜第一个ComboBox
被设置为发生数据绑定时可用的数据。在那个阶段,因为第一个ComboBox
是数据绑定的,所以第二个还没有任何项目,因此也就没有绑定。相同的第三等。
关于如何使绑定生效的任何建议?我可能可以通过添加代码来捕获各种事件来破解此漏洞,但是除了打破MVVM模式之外,这听起来像没有一种情况最终会造成混乱和错误。
答案 0 :(得分:1)
通常来说,您不应该直接绑定到元素,而应该绑定到视图模型中的属性。这样,您就可以知道属性通知已正确完成,并且可以添加断点等以确认绑定也正常工作。在这种特殊情况下,您需要在第一个ComboBox中添加类似SelectedItem="{Binding Level1Item}"
之类的内容,然后在视图模型中为其添加属性:
public ProblemCode _Level1Item;
public ProblemCode Level1Item
{
get { return this._Level1Item; }
set
{
if (this._Level1Item != value)
{
this._Level1Item = value;
RaisePropertyChanged(() => this.Level1Item);
}
}
}
然后您的第二个ComboBox绑定到该属性,而不是Element.SelectedItem.Children:
<ComboBox ItemsSource="{Binding Level1Item.Children}"
...etc...
重复第二个和第三个组合框,您将拥有所需的功能。