我已经和它斗争了三天,我准备粉碎我的电脑了。对不起,不得不发泄。
我有一个WPF 4.5应用程序遵循MVVM模式,Entity Framework 6作为模型。在我的应用程序中,主应用程序窗口中有一个Tab控件,其中包含每个选项卡的视图/视图模型。
我遇到问题的标签是一个简单的主视图和详细视图,其中包含列表框和详细信息网格。网格包含绑定到列表框所选项的属性的文本框,组合框和日期选择器。当用户首次创建和访问此视图时,一切都很有效。但是,当我单击另一个选项卡并单击返回此选项卡时,我会遇到以下问题。
我的问题:一旦另一个标签获得焦点,然后焦点返回到此标签,就会出现两个开始出现绑定问题的组合框。
问题不一致,但由于某种原因,组合框开始显示记录的错误值。当我单击列表框选择不同的记录时,组合框开始显示错误的值,并且视图模型中的绑定也是错误的。但是网格中还有10个其他组合框和更多文本框,它们为各自的属性显示正确的值而没有任何错误。
我无法弄清楚为什么这两个组合框会在视图的标签从另一个标签返回焦点后开始显示错误的值。
以下是获取错误值的两个组合框的声明,列表框的选定项目绑定到viewmodel中的Selection属性:
<ContentControl Name="Selection" DataContext="{Binding Path=Selection, Mode=TwoWay}">
<Grid >
<ComboBox Name="idForeman"
Style="{StaticResource FTC_DetailComboBox}"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.EmployeeForemanCVS.View}"
SelectedValuePath="idEmployee"
SelectedValue="{Binding idForeman, Mode=TwoWay, ValidatesOnDataErrors=True}" >
<ComboBox.ItemTemplate>
....
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox Name="idClient"
Style="{StaticResource FTC_DetailComboBox}"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.ClientViewSource.View}"
SelectedValuePath="idClient"
SelectedValue="{Binding idClient, Mode=TwoWay, ValidatesOnDataErrors=True}"
DisplayMemberPath="chrCompany" >
</ComboBox>
<Grid />
<ContentControl />
这是一个组合框的例子,它没有错误,但每次都能正常工作:
<ComboBox Name="idEnteredBy"
Style="{StaticResource FTC_DetailComboBox}"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.EmployeeEnteredCVS.View}"
SelectedValuePath="idEmployee"
SelectedValue="{Binding idEnteredBy, Mode=TwoWay, ValidatesOnDataErrors=True}" >
<ComboBox.ItemTemplate>
....
</ComboBox.ItemTemplate>
</ComboBox>
正如您所看到的那样,它们被声明为相同类型的项目来源。
所有这些控件都绑定到一个collectionViewSource,它的源代码有一个observableCollection。集合是在ViewModel的构造函数中创建的。
有人可以帮我弄清楚为什么这些组合框只有在其父标签从另一个标签获得焦点后才会出现错误值,但是在首次创建标签时却没有?
我知道这是一个糟糕的形式,但我完全渴望在这里找到解决方案,因为这是一个应用程序破解错误。任何帮助是极大的赞赏。
提前致谢!
我将上面第一个xaml示例的datacontext声明添加到澄清组合框从哪里获取上下文。