WPF级联组合框在窗口加载时未绑定

时间:2018-07-16 21:37:37

标签: wpf mvvm combobox

我正在使用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模式之外,这听起来像没有一种情况最终会造成混乱和错误。

1 个答案:

答案 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...

重复第二个和第三个组合框,您将拥有所需的功能。