Rosh@n Ответов: 1

Как выполнить фиксацию ячейки за ячейкой в базе данных в 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 обновляется, и фокус теряется из строки, над которой работает пользователь.

Я был бы признателен за любую форму помощи или предложения.

1 Ответов

Рейтинг:
2

#realJSOP

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