Можно ли конвертировать триггеры событий в viewmodel, используя конвертеры? - PullRequest
0 голосов
/ 06 октября 2019

Я пишу приложение WPF в MVVM, используя MVVM Light. У меня есть триггер события в DataGrid для обнаружения окончания редактирования ячейки.

В viewmodel У меня есть команда, которой нужен элемент привязки DataGrid в качестве параметра. Я сделал это, используя приведение DataGridCellEditEndingEventArgs.EditingElement.DataContext к моей модели. Это работает, как я хочу, но это сложно для тестирования VM.

Вот триггер View

// xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<DataGrid x:Name="PeopleDataGrid" ItemsSource="{Binding People}" >
<i:Interaction.Triggers>
                            <i:EventTrigger EventName="CellEditEnding">
                                <cmd:EventToCommand PassEventArgsToCommand="True" Command="{Binding EditPersonRowCommand}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>

А в VM вот команда

public RelayCommand<DataGridCellEditEndingEventArgs> EditPersonRowCommand
        {
            get
            {
                return editPersonRowCommand ??
                       (editPersonRowCommand =
                           new RelayCommand<DataGridCellEditEndingEventArgs>(param => this.EditPersonRow(param.EditingElement.DataContext as PersonForListDto), this.editPersonRowCommandCanExecute));
            }
        }

Возможно использовать IValueConverterили что-то для правильной модели модели без контрольного приведения?

1 Ответ

1 голос
/ 06 октября 2019

Свойство зависимости PassEventArgsToCommand передает аргумент события в команду. Вместо использования PassEventArgsToCommand вы можете определить привязку для CommandParameter для передачи DataContext. С этим, в VM, RelayCommand может определить с фактическим типом. Код в View и ViewModel будет выглядеть следующим образом:

<i:Interaction.Triggers>
                            <i:EventTrigger EventName="CellEditEnding">
                                <cmd:EventToCommand Command="{Binding EditPersonRowCommand}" CommandParameter="{Binding //Since you have not given the full code so not sure how Binding is cascading so if you require to use ReleativeSource to bind to DataContext then use that.}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>

и

public RelayCommand<PersonForListDto> EditPersonRowCommand
        {
            get
            {
                return editPersonRowCommand ??
                       (editPersonRowCommand =
                           new RelayCommand<PersonForListDto>(param => this.EditPersonRow(param), this.editPersonRowCommandCanExecute));
            }
        }

С учетом вышеизложенного ваша виртуальная машина будет чище и ее можно будет легко протестировать на модуле.

...