【问题标题】:Updating WPF Datagrid's SelectedItem from a ViewModel and have the changes reflected back in the Datagrid从 ViewModel 更新 WPF Datagrid 的 SelectedItem 并将更改反映在 Datagrid 中
【发布时间】: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 的属性发生变化时。

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

感谢用户 nnmait,我可以解决我的问题。我的模型类没有实现 INotifyPropertyChanged,只是我的 ViewModels。在我的模型类中实现这个接口解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多