Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加载窗口时WPF级联组合框未绑定_Wpf_Mvvm_Combobox - Fatal编程技术网

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

加载窗口时WPF级联组合框未绑定,wpf,mvvm,combobox,Wpf,Mvvm,Combobox,我正在使用WPF和MVVM,并且有一个支持票证窗口,其中包含如下级联组合框。第一个绑定到视图模型上的ObservableCollection。ProblemCode对象对其子代码具有自引用属性,其级别为四个代码。组合框的XAML看起来是这样简化的,为了简洁起见,只显示了三个 <ComboBox ItemsSource="{Binding ElementName=Root, Path=DataContext.ProblemCodes, Mode=TwoWay}" Name=

我正在使用WPF和MVVM,并且有一个支持票证窗口,其中包含如下级联组合框。第一个绑定到视图模型上的ObservableCollection。ProblemCode对象对其子代码具有自引用属性,其级别为四个代码。组合框的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}" />
当我加载一个新票证窗口时,第一个组合框被正确填充。选择一个项目将填充第二个项目,以此类推。当我保存票据时,数据已正确保存

但是,当我保存票据并重新打开窗口时,只有第一个组合框设置了所选项目。其他组合框没有任何设置

我猜第一个组合框被设置为在数据绑定发生时数据可用。在那个阶段,由于第一个组合框是数据绑定的,第二个组合框还没有任何项目,所以没有绑定。第三个也一样,以此类推


有人对如何使装订工作有什么建议吗?我可能可以通过添加代码来捕获各种事件来解决这一问题,但除了打破MVVM模式外,似乎没有任何一种情况会以复杂和错误告终。

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

public ProblemCode _Level1Item;
public ProblemCode Level1Item
{
    get { return this._Level1Item; }
    set
    {
        if (this._Level1Item != value)
        {
            this._Level1Item = value;
            RaisePropertyChanged(() => this.Level1Item);
        }
    }
}
然后,您的第二个组合框绑定到此属性,而不是Element.SelectedItem.Children:

<ComboBox ItemsSource="{Binding Level1Item.Children}"
    ...etc...

对第二个和第三个组合框重复上述操作,您将获得所需的功能。

您的viewmodel外观如何?很抱歉,回复延迟。这很好,非常感谢。