Как мне получить datagrid для обновления после каждого редактирования ячейки?
У меня есть класс статей затрат, который автоматически возвращает общую стоимость товара, например:
public class EstimateCostItem { public double UnitCost { get => _unitCost; set => _unitCost = value; } public double Quantity { get => _quantity; set => _quantity = value; } public double Subtotal => _unitCost * _quantity; private double _quantity = 0.0; private double _unitCost = 0.0; }
В моем слое модели у меня есть такая коллекция, как эта:
public List<EstimateCostItem> CostItems { get; } = new List<EstimateCostItem>();
Я показываю эти предметы примерно так:
<DataGrid x:Name="DataGridCostItems" ItemsSource="{Binding CostItems}" SelectionMode="Single" </DataGrid>
У меня также есть некоторый код, который предназначен для уведомления модели представления (и, следовательно, представления) об изменениях, когда это необходимо. Этот код, кажется, работает нормально.
Проблема, с которой я сталкиваюсь, заключается в том, что, когда пользователь редактирует либо
UnitCost
или Quantity
, этот Subtotal
не обновляется до тех пор, пока пользователь не покинет редактируемую в данный момент строку. Это подтверждается точкой останова в set
методы выше; эти точки останова не достигаются до тех пор, пока пользователь не покинет всю строку.Мне все равно, так или иначе, если модель обновляется, когда пользователь покидает отдельную ячейку, но пользователю кажется запутанным, что промежуточный итог не обновляется до тех пор, пока пользователь не покинет всю строку.
Есть ли способ изменить это поведение?
Что я уже пробовал:
Я попытался следовать этому примеру здесь: WPF DataGrid фиксирует изменения ячеек.
Но я всегда получаю null для следующего кода в
CellEditEnding
событие:DataRowView row = e.Row.Item as DataRowView;
Тип который я получаю это
DataGridRow
- Это не имеет никакого значения. EndEdit()
метод и, кажется, нет никакого способа получить DataRowView
от А DataGridRow
.Я думаю, что проблема заключается в том, что я не привязан к
DataTable
но я все еще пытаюсь найти способ обойти это.
Maciej Los
Кажется, вы забыли установить Mode="TwoWay"
для связывания. Видеть: Связующий.Свойство Mode (System.Windows.Data) | Microsoft Docs[^]
Patrick Skelton
Решение, которое я нашел ниже, похоже, работает и без этого, но я должен признать, что не знал, что оно было односторонним по умолчанию, так что, вероятно, в какой-то момент оно выползло бы и укусило меня. Спасибо за предложение.
Maciej Los
Всегда пожалуйста.