WPF绑定组合框对象到datagrid对象列表

时间:2018-04-12 14:20:44

标签: wpf xaml

我将创建一个示例,简化我的问题。我有一个WPF视图,由2个数据网格和一个组合框组成。

Datagrid 1 - 类列表

Datagrid 2 - 所选课程中的学生列表

Combobox - 所有学生

我的目标是使用组合框选择课堂上的学生。我希望能够将选定的学生从组合框绑定到datagrid 2中当前选定的学生。

我可以从datagrid 1中的选择中更新datagrid 2而不会出现任何问题。我面临的问题是尝试将组合框对象绑定到datagrid 2的选定项目时。

数据网格2的XAML如下:

<DataGrid 
    Name="dataGridClass" 
    ItemsSource="{Binding SelectedClass.Students}" 
    SelectedItem="{Binding Path=SelectedStudent, Mode=TwoWay}"

组合框的XAML如下:

<ComboBox 
    x:Name="comboStudent" 
    ItemsSource="{Binding Students}"
    DisplayMemberPath="Name" 
    SelectedItem="{Binding SelectedStudent,Mode=TwoWay}"

当我使用comboStudent选择学生时,我希望dataGridClass中当前选择的学生能够反映新的组合框选择。我希望组合框具有双向绑定,这样如果使用dataGridClass选择学生,那么组合框中的值也会更新以反映这一点。

目前,当选择comboStudent值时,它对dataGridClass没有影响(反之亦然)。这不是通知属性更改的问题,因为我可以看到基础列表SelectedClass.Students也保持不变。

我已经开始绕过这个问题,但它开始变得非常脏,非常快。我觉得我错过了一些明显的东西,但却无法让它发挥作用。我有一个通过该网站的侦察员,但没有发现任何解决我的问题。我在我的应用程序中有许多其他绑定工作正如我所期望的那样,感觉好像从一个源到另一个源的完整对象的绑定以稍微不同的方式工作。

任何帮助都会受到大力赞赏。欢呼声。

2 个答案:

答案 0 :(得分:0)

您似乎没有设置对象的DataContext

答案 1 :(得分:0)

我强烈猜测没有给出对象标识。 SelectedItem ComboBox DataGridSelectedValue的绑定搜索了SelectedItem中选择的exakt相同项目。我假设您有两个学生列表,一个填充ComboBox,另一个是您班级的属性。

首先,您可以尝试选择IEquatable<Student>而不是ComboBox,它会比较对象的相等性而不是引用相等性。你应该实施ComboBox然后(如果你还没有,你应该这样做)。这可以帮助您使用Linq,但在ILookup<Student>中选择某些内容时仍然无法更新DataGrid 2。

您可以使用选择更改的处理程序解决此另一个问题,但我会尝试在列表中使用相同的学生对象,例如使用Students为类的一组列表获取SelectedValuePath

查看您的财产SelectedValue的实施情况会有所帮助。

如Ed Plunkett所提到的

编辑,ComboBox上有一个DisplayNamePath,可用于更新DisplayNamePath="Name"。在大多数情况下,这与您已使用的IEquatable<Student>结合使用。因此,您不需要在相等性上比较完整项目(这将是默认项目),但也可以使用例如Student选择具有相同全名的学生。然后,您不会被迫实施var list = document.getElementsByClassName("example"); for(var i=0;i<list.length;i++){ list[i].classList.add("mystyle"); } ,而只会检查var x = document.querySelectorAll('div'); var i; for (i = 0; i < x.length; i++) { if(x[i].classList.value.indexOf('example') > -1){ x[i].classList.add("mystyle"); } } 的一个属性。这也无法解决DataGrid的更新问题,但无论如何都要知道。