C# 在另一个类中的属性更改后,如何调用方法?

C# 在另一个类中的属性更改后,如何调用方法?,c#,wpf,C#,Wpf,我已经试着找出这个问题有一段时间了,我觉得我已经接近解决方案了,但是我遗漏了一些关键的信息。我希望这里有人能帮我指出正确的方向 我正在写一个程序来跟踪组件的重量和重心。我有四个主要的课程: 基本零件:定义独立于位置(零件号、体积、密度、质量)的零件特性 DetailedPart:BasicPart的一个子类,也包含基于位置的信息(例如,CG位置) StdPartLibrary:只有一个属性(一个列表对象)和一些方法,用于将基本零件信息保存到文件或从文件中加载 MassModel:只有一个属性(列

我已经试着找出这个问题有一段时间了,我觉得我已经接近解决方案了,但是我遗漏了一些关键的信息。我希望这里有人能帮我指出正确的方向

我正在写一个程序来跟踪组件的重量和重心。我有四个主要的课程:

  • 基本零件:定义独立于位置(零件号、体积、密度、质量)的零件特性
  • DetailedPart:BasicPart的一个子类,也包含基于位置的信息(例如,CG位置)
  • StdPartLibrary:只有一个属性(一个列表对象)和一些方法,用于将基本零件信息保存到文件或从文件中加载
  • MassModel:只有一个属性(列表对象)和一些方法,例如计算部件的CG位置
  • 用户界面是一个WPF表单,其中包括一个显示StdPartLibrary数据的数据网格和一个基于MassModel数据的表格,该表格显示部件的总质量和重心信息。我在BasicPart类上实现了INotifyPropertyChanged接口,因此当用户更改表中的任何内容时,datagrid将自动重新计算质量、体积和/或密度

    但我的问题是:

    当用户更新datagrid中的数据时,我想不出一种方法来更新表以自动重新计算总质量和重心位置。现在,我有一个按钮,用户必须按下,以更新总质量和重心位置信息,这就是工作。但我现在一直坚持下去,我真的很想弄明白这一点

    从我所阅读的内容来看,听起来我需要以某种方式订阅BasicPart中的PropertyChangedEventHandler,但我似乎无法确切地知道如何或在何处实现它。有什么建议吗

    回答


    结果证明我是个白痴。正如Steve Byrne在评论中指出的,我只需要运行代码来更新DataGrid的CurrentCellChanged事件中的质量属性。谢谢

    以下是基本情况,
    CellEditEnd
    事件在保存在数据网格中的内容之间触发,用户尝试停止编辑单元格后,可以取消该事件以强制用户继续编辑,因此在事件结束之前不会提交(保存)更改

    因此,您需要使用另一个事件,例如:
    CurrentCellChanged
    ,该事件将在单元格更改(提交/保存)后触发但不会告诉您更改了哪个单元格Scottlogic.com提供了下面的示例代码,以组合
    CurrentCellChanged
    CellEditEnd
    来获取正在编辑的单元格,并在触发事件后触发:

    private DataRowView rowBeingEdited = null;
    
    private void dataGrid_CellEditEnding(object sender,
                                      DataGridCellEditEndingEventArgs e)
    {
        DataRowView rowView = e.Row.Item as DataRowView;
        rowBeingEdited = rowView;
    }
    
    private void dataGrid_CurrentCellChanged(object sender, EventArgs e)
    {
        if (rowBeingEdited != null)
        {
            rowBeingEdited.EndEdit();
        }
    }
    

    最后,还有另一个更复杂的解决方案,即通过调用

      grid.CommitEdit(DataGridEditingUnit.Row, true);
    
    (完整教程,可以找到原始代码)


    然后在数据已提交的情况下运行方法

    以下是基本情况,
    CellEditEnd
    事件在保存在数据网格中的内容之间触发,用户尝试停止编辑单元格后,可以取消该事件以强制用户继续编辑,因此在事件结束之前不会提交(保存)更改

    因此,您需要使用另一个事件,例如:
    CurrentCellChanged
    ,该事件将在单元格更改(提交/保存)后触发但不会告诉您更改了哪个单元格Scottlogic.com提供了下面的示例代码,以组合
    CurrentCellChanged
    CellEditEnd
    来获取正在编辑的单元格,并在触发事件后触发:

    private DataRowView rowBeingEdited = null;
    
    private void dataGrid_CellEditEnding(object sender,
                                      DataGridCellEditEndingEventArgs e)
    {
        DataRowView rowView = e.Row.Item as DataRowView;
        rowBeingEdited = rowView;
    }
    
    private void dataGrid_CurrentCellChanged(object sender, EventArgs e)
    {
        if (rowBeingEdited != null)
        {
            rowBeingEdited.EndEdit();
        }
    }
    

    最后,还有另一个更复杂的解决方案,即通过调用

      grid.CommitEdit(DataGridEditingUnit.Row, true);
    
    (完整教程,可以找到原始代码)


    然后在数据已提交的情况下运行方法

    你可以发布一些代码吗?这将更有助于理解问题,你的应用程序是使用mvvmso的吗?你可以这样做吗?如果有,请告诉我more@SteveByrne我先试过了。我在DataGrid上使用了CellEditEnding事件,但这似乎是在属性更改之前执行的。@Steve是DataGrid的项目源是
    PartsList
    ,用户在网格中编辑一些东西,你需要更新该对象,对吗?@Steve,或者steve Byrne请发布您对此问题的解决方案,作为对该问题的回答。您可以发布一些代码吗?了解问题会更有帮助,您的应用程序是否使用MVVMO u wana请执行类似操作,如果有,请告诉我more@SteveByrne我先试过了。我在DataGrid上使用了CellEditEnding事件,但该事件似乎是在属性更改之前执行的。@Steve是DataGrid的项目源是
    PartsList
    ,用户在网格中编辑了一些东西,您需要更新该对象,对吗?@Steve或Steve Byrne请发布您对此的解决方案,作为此问题的答案。