【发布时间】:2015-09-16 16:15:16
【问题描述】:
当最外层控件的 DataContext 发生更改时,我在使用 ItemSources 的嵌套控件时遇到问题。内部控件似乎会更新以反映新的 DataContext,但它就像有一些“Ghost”绑定仍然绑定到旧的 DataContext。
我怀疑具有 DataTemplates 的嵌套控件会阻止内部控件的绑定在外部控件的 DataContext 更改时更新。我在某处读到,只有绑定只响应从 PATH 中明确定义的对象引发的 PropertyChanged 事件。
我的问题是:您如何使用 ItemsSources 从下一个控件中完全定义绑定 PATH?就我而言:
<DataGrid name="OuterGrid" ItemsSource={Binding SelectedSchool.Classes}">
<ItemsControl ItemsSource={Binding Students}">
<ComboBox SelectedItem={Binding Grade}" />
</ItemsControl>
</DataGrid>
我想完全指定内部 ComboBox 的 SeletedItem PATH,如下所示,但我需要将它绑定到集合中的特定项目(不仅仅是索引 0 处的项目)。
<ComboBox SelectedItem="{Binding ElementName=OuterGrid,
Path=DataContext.SelectedSchool.Classes[0].Students[0].Grade}" />
我在下面有一个更详细的问题示例,我无法发布实际代码或描述我正在使用的 ACTUAL 对象(安全原因),所以我尝试以最简单的方式描述它理解。
型号:
我有一个相当复杂的 Biz 对象,其中包含其他对象的集合。集合中的项目也有集合。
- 学校有很多课程
- 班级有很多学生
- 每个学生都有一个班级的字母等级。
- 可能的字母等级列表因学校而异。
每个类(包括我的 ViewModel)都实现了 INotifyPropertyChanged,每个集合都是一个 ObservableCollection。
视图模型:
我的 ViewModel 具有以下属性:
- 可观察的学校集合...(AllSchools)。
- 一所名校
- 布尔值 (IsEditing)
- 可能成绩的 ObservableCollection(当 IsEditing 更改时会更新,并且基于所选学校)。
这里要注意的重要一点是,不同的学校可能有不同的可能成绩(即,一所可能有 A+、A 和 A-,而另一所只有 A)。
XAML:
我有一个 Datagrid 绑定到我的 ViewModel 的 AllSchools 集合和我的 ViewModel 的 SelectedSchool 属性。当用户双击一行时,事件处理程序通过更改 ViewModel 的 IsEditing 属性(编辑面板的 Visibily 绑定到 IsEditing 属性)为所选学校打开一个“编辑面板”。在编辑面板内我有一个 Datagrid(绑定到所选学校的班级集合),在 Datagrid 内我有一个 TemplatedColumn 和一个 ItemsControl(绑定到集合当前班级的学生)。对于每个学生,都有一个 ComboBox 表示该学生在班级中的成绩。 ComboBox 的 ItemsSource 是 ViewModel 的 PossibleGrades 集合。
问题:
问题是,当 SelectedSchool 更改时,以前 SelectedSchool 中的任何学生的字母成绩对于新 SelectedSchool 不存在,突然将他们的字母成绩设置为 null(因为 ComboBox 的 ItemsSource 不再具有等级)。
从视觉上看,一切似乎都运行良好。编辑面板正确显示所选学校的属性,并在 SelectedSchool 属性更改时更新。但是,如果我重新打开第一所学校的编辑面板,则不再选择任何组合框的值,因为当我选择第二所学校时它们都设置为 null。
就像旧的 ComboBox 仍然有它们的绑定,即使它们不再出现在屏幕上。但如果只影响之前的 SelectedSchool(而不是之前的 SelectedSchool)。
【问题讨论】:
标签: wpf xaml mvvm binding datagrid