Как выполнить фиксацию ячейки за ячейкой в базе данных в MVVM WPF?
Вместо того чтобы по строкам изменять/фиксировать базу данных с помощью EntityFramework в WPF MVVM, я хочу фиксировать свои изменения по ячейкам.
Между тем, я также хочу обновить значения в других ячейках на основе значения, введенного в конкретную ячейку. Например, если пользователь вводит определенную сумму в столбец с именем "сумма", основываясь на значении "сумма", то какой-то другой столбец также должен быть обновлен. Если значение "сумма" положительное, то другой столбец с именем "Дебет" будет иметь то же значение, что и "сумма", а столбец с именем "кредит" будет равен 0. Аналогично и наоборот для случая, когда "сумма" отрицательна.
Что я уже пробовал:
В представлении, в элементе управления DataGrid (который привязан к CollectionView, определенной в модель представления представления ) У меня есть шаблон столбца сумма. На основе значения этого столбца должны быть обновлены значения в DatagridTextColumns, debit и credit.
<DataGridTemplateColumn x:Name="Amount" Header="Amount"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Amount}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Text="{Binding Amount,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" BorderThickness="0"> <interactivity:Interaction.Triggers> <interactivity:EventTrigger EventName="LostFocus"> <interactivity:InvokeCommandAction Command="{Binding DataContext.SaveButtonClick,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" /> </interactivity:EventTrigger> </interactivity:Interaction.Triggers> </TextBox> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> <DataGridTextColumn x:Name="DebitAmount" Header="Dr Amount" Binding="{Binding DebitAmount,UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn x:Name="CreditAmount" Header="Cr Amount" Binding="{Binding CreditAmount,UpdateSourceTrigger=PropertyChanged}"/>
В ViewModel,
private ActionCommand SaveButtonCommand; public ICommand SaveButtonClick { get { return SaveButtonCommand; } } public void Save() { RelationDBContext.SaveChanges(); JournalCollectionView = CollectionViewSource.GetDefaultView(RelationDBContext.JournalLines.ToList()); //refreshing viewsource if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(nameof(JournalCollectionView))); } }
в модели,
<pre> public decimal Amount { get { return _Amount; } set { _Amount = value; if (Amount >= 0) { DebitAmount = value; CreditAmount = 0; } else { CreditAmount = value; DebitAmount = 0; } } }
После этого я смог выполнить оба своих требования. Но я столкнулся с проблемой. Поскольку мне нужно, чтобы изменения, внесенные в конкретную ячейку (которая передается в базу данных, которая, в свою очередь, также обновляет две другие ячейки дебет и кредит), немедленно отразились на datagrid, я поднял propertychangedevent для CollectionView (JournalCollectionView), который привязан к моей datagrid. При этом фокус курсора не остается на строке, над которой работает пользователь, вместо этого вся datagrid обновляется, и фокус теряется из строки, над которой работает пользователь.
Я был бы признателен за любую форму помощи или предложения.