Как перевести CodeBehind WPF Events;Событие, обработчик, EventSetter для шаблона MVVM? - PullRequest
0 голосов
/ 19 октября 2011

Я пытаюсь перевести события WPF CodeBehid, такие как Event, Handler, EventSetter, в шаблон MVVM. Мне не разрешено использовать System.Windows.Controls, так как я использую MVVM. И я также избегаю сторонних библиотек для решения этой проблемы.

Может кто-нибудь объяснить, как преобразовать следующий обработчик событий CodeBehind в обработчик событий MVVM? Пожалуйста, объясните как можно больше во время написания ответа.

XAML код

<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}"> 
  <DataGridCheckBoxColumn.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter> 
    </Style> 
  </DataGridCheckBoxColumn.CellStyle> 
</DataGridCheckBoxColumn> 

Код позади

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 
        var temp = (sender as DataGridCell).Content; 
        if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked; 
    } 
} 

Ответы [ 3 ]

1 голос
/ 19 октября 2011

Есть несколько правил большого пальца, касающихся MVVM ....

  1. Ваши Models и ViewModles не должны ссылаться на System.Windows.Controls пространство имен.
  2. Ваши Models и ViewModles не должны обрабатывать события. Для этого используйте ICommand интерфейс.
  3. RoutedCommand недопустимо в Models / ViewModels (из-за пункта 2). Следовательно, используйте DelegateCommand / RelayCommand

Сказав это, все вышеперечисленные пункты совершенно допустимы , если вы написали Присоединенное поведение в MVVM .

1 голос
/ 19 октября 2011

Вы также можете использовать библиотеки Caliburn Micro , чтобы иметь возможность прикреплять обработчик в ViewModel к событию в View.

Пример кода:

 ...  xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"....

 <Button Content="Edit" DataContext="{Binding Path=VmInstance}" 
             cal:Message.Attach="[Event Click] = [Action EditFilter]" />
1 голос
/ 19 октября 2011

У вас есть несколько вариантов:

  1. Присоедините обработчик событий в XAML, но единственное, что делает обработчик событий, - это вызывает в модель представления, передавая соответствующие аргументы (важно не передавать никакие элементы уровня GUI в модель представления - только данные необходимо выполнить действие)

  2. Используйте поведение EventToCommand (показано здесь), чтобы присоединить экземпляр ICommand (из вашей модели представления) к событию в вашем представлении

Пока вы не пытаетесь настроить эти обработчики событий в стилях или шаблонах, я бы порекомендовал использовать вариант № 1 - отсутствует железный закон, запрещающий вам использовать обработчики событий, когда это удобно, до тех пор, пока модель представления это то, что на самом деле выполняет всю работу

Редактировать: Вариант № 1

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 

        var checkBox= (sender as DataGridCell).Content as CheckBox; 
        if(checkBox != null) 
        {
            var viewModel = (MyViewModel)checkBox.DataContext;
            viewModel.ToggleApprovedStatus();
        }
    } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...