Как я могу вызвать метод после изменения свойства в другом классе? - PullRequest
0 голосов
/ 19 марта 2019

Я пытался выяснить это некоторое время, и я чувствую, что близок к решению, но мне не хватает некоторой важной информации. Я надеюсь, что кто-то здесь может помочь направить меня в правильном направлении.

Я пишу программу для отслеживания веса и центра тяжести сборки. У меня есть четыре основных класса:

  1. BasicPart: определяет свойства детали, которые не зависят от местоположения (номер детали, объем, плотность, масса)
  2. DetailPart: подкласс BasicPart, который также содержит информацию о местоположении (например, местоположение CG)
  3. StdPartLibrary: имеет только одно свойство (объект List) и несколько методов для таких вещей, как сохранение / загрузка информации о базовой детали в / из файла
  4. MassModel: имеет только одно свойство (объект List) и несколько методов для таких вещей, как вычисление местоположения CG сборки

Пользовательский интерфейс - это форма WPF с, среди прочего, сеткой данных, показывающей данные StdPartLibrary, и таблицей, основанной на данных MassModel, показывающей общую массу сборки и информацию CG. И я реализовал интерфейс INotifyPropertyChanged в классе BasicPart, чтобы сетка данных автоматически пересчитывала массу, объем и / или плотность, когда пользователь изменяет что-либо в таблице.

Но вот моя проблема:

Я не могу найти способ обновить таблицу для автоматического пересчета общей массы и местоположения компьютерной графики, когда пользователь обновляет данные в сетке данных. Прямо сейчас у меня есть кнопка, которую пользователь должен нажать, чтобы обновить общую массу и информацию о местонахождении компьютерной графики, и он выполняет свою работу. Но сейчас я настаиваю на этом и очень хочу это выяснить.

Из того, что я читал, звучит так, будто мне нужно каким-то образом подписаться на PropertyChangedEventHandler в BasicPart, но я не могу точно понять, как и где я бы это реализовал. Любой совет?

ОТВЕТ

Так что получается, что я идиот. Как отметил Стив Бирн в комментариях, мне просто нужно было запустить мой код, чтобы обновить массовые свойства в событии CurrentCellChanged объекта DataGrid. Спасибо!

1 Ответ

2 голосов
/ 19 марта 2019

Итак, вот основы, событие 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();
    }
}

(источник кода от blog.scottlogic.com, опубликованный Колином Э.)

Наконец, есть еще одинсложное решение, которое заключалось бы в принудительной фиксации данных в ячейках путем вызова

  grid.CommitEdit(DataGridEditingUnit.Row, true);

(полное руководство, а оригинальный код можно найти здесь )

а затем работаетВаш метод теперь, когда данные были зафиксированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...