Patrick Skelton Ответов: 1

Как мне получить 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

Всегда пожалуйста.

1 Ответов

Рейтинг:
9

Patrick Skelton

Похоже, что мне нужно вот это:

<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity,UpdateSourceTrigger=LostFocus}"/>


Как подробно описано в следующем вопросе CodeProject, который я только что нашел. :-|

https://www.codeproject.com/Questions/406102/WPF-DataGrid-immediate-update-on-Cell-Change


Maciej Los

Отлично!