【发布时间】:2014-10-30 04:44:47
【问题描述】:
我已经寻找这个问题的解决方案很长时间了,这让我发疯了。我只是似乎没有找到问题所在以及如何解决它。
关于手头的问题:我正在开发一个项目,在该项目中我将 WPF 与 MVVM 模式结合使用。我有一个数据网格,已绑定到 ViewModel 中的 ObservableCollection 属性。我还将数据网格的 SelectedItem 属性绑定到 ViewModel 中的 CurrentStudent 属性。
现在,每当我更改他/她的姓名、姓氏、学生编号或电子邮件时,我希望能够在数据库中更新数据网格中任何选定的学生。我可以更新数据库中的学生,因为我可以通过 ViewModel 中的 SelectedStudent 属性访问数据网格中选定的学生。最大的问题是我想直接在我的 ViewModel 中更改此属性,并在我进行更改后立即将所选学生的更改反映到数据网格中。但我不能,为了我的一生,弄清楚我做错了什么。起初,为了实现我的目标,我需要做的事情似乎很容易和微不足道,但它就是行不通。我可以让选定的学生进入我的 ViewModel 属性,但我无法使更改在数据网格中可见,除非我关闭视图并重新加载它并让应用程序从数据库中加载学生,然后我才能看到数据网格的变化。
这是在我的 ViewModel 中不起作用的代码:
EstudianteSeleccionado.Nombres = Nombres;
EstudianteSeleccionado.Apellidos = Apellidos;
EstudianteSeleccionado.Email = Email;
EstudianteSeleccionado.Matricula = Matricula;
bc.actualizarEstudiante(EstudianteSeleccionado);
此代码负责更新所选学生。这是属性 EstudianteSeleccionado 的定义:
private Estudiante _estudianteSeleccionado;
public Estudiante EstudianteSeleccionado
{
get
{
return _estudianteSeleccionado;
}
set
{
if(value != _estudianteSeleccionado)
{
_estudianteSeleccionado = value;
OnPropertyChanged();
}
}
}
正如我已经说过的,在我的视图中,这是数据网格 SelectedItem 绑定的属性。接下来是数据网格的 XAML:
<DataGrid ItemsSource="{Binding Estudiantes, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" SelectedItem="{Binding EstudianteSeleccionado, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Matr?cula" IsReadOnly="True" Binding="{Binding Matricula, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<DataGridTextColumn Header="Nombres" IsReadOnly="True" Binding="{Binding Nombres, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<DataGridTextColumn Header="Apellidos" IsReadOnly="True" Binding="{Binding Apellidos, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<DataGridTextColumn Header="Email" IsReadOnly="True" Binding="{Binding Email, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
最后一点:一旦我从 ViewModel 中修改 SelectedStudent 属性并且它确实发生了变化,我检查了我的学生集合是否得到更新。它似乎只是没有通知数据网格其集合中的项目已更改。这是代表学生集合的属性:
public ObservableCollection<Estudiante> Estudiantes
{
get
{
return _estudiantes;
}
set
{
if (_estudiantes != value)
{
_estudiantes = value;
OnPropertyChanged();
}
}
}
我认为数据网格的 DataGridTextColumn 中的绑定可能存在问题。也许他们没有收到有关更改的通知,但我几乎尝试了所有设置,但当集合中的项目从 ViewModel 修改时,它没有收到通知。
【问题讨论】:
-
Estudiante类中的属性是否会通知属性更改? -
我的模型类没有实现 INotifyPropertyChanged。只是 ViewModel 类。
-
Estudiante还应该实现 INotifyPropertyChanged,或者应该有一个 ViewModel 公开模型属性,以便可以通知 View,在这种情况下是数据网格中的单元格。 -
....我在我的类上实现了 INotifyPropertyChanged,现在它可以工作了...我只是不明白。我的属性实现了 INotifyPropertyChanged,它应该通知有界的 SelectedItem,它应该在对象更改后发生更改。为什么这不起作用?
-
当 SelectedItem 发生变化时通知它,而不是当 SelectedItem 的属性发生变化时。