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

问题描述 投票:0回答:1

我正在使用WPF和MVVM,并且有一个支持票证窗口,其中包含级联ComboBoxes,如下所示。第一个是视图模型上的ObservableCollection<ProblemCode>ProblemCode对象具有与其子代码相关的自引用属性,最低可达四个代码。 ComboBoxes的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具有所选项目集。其他ComboBoxes没有任何设置。

我想第一个ComboBox被设置为数据绑定发生时可用的数据。在那个阶段,由于第一个ComboBox是数据绑定,第二个没有任何项目,所以不受约束。第三个相同,依此类推。

任何有关如何使绑定工作的建议?我可能通过添加代码来捕获各种事件来破解这一点,但除了打破MVVM模式之外,听起来没有一种情况会导致错综复杂和错误。

wpf mvvm combobox
1个回答
1
投票

一般来说,您不应该直接绑定到元素,您应该绑定到视图模型中的属性。这样你知道属性通知正在正确完成,你可以添加断点等来确认绑定都是正常的。在这种特殊情况下,您需要将SelectedItem="{Binding Level1Item}"之类的内容添加到第一个ComboBox中,然后在视图模型中为其添加属性:

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

重复第二个和第三个ComboBoxes,你将拥有你所追求的功能。

© www.soinside.com 2019 - 2024. All rights reserved.