Есть ли способ избежать реализации ICommand, чтобы использовать кнопку в MVVM? - PullRequest
0 голосов
/ 17 ноября 2018

Я разрабатываю очень простое приложение, представление с несколькими кнопками.Я хотел бы использовать событие нажатия кнопок в модели представления.

Но я нашел только примеры, в которых нужно использовать Interactivity.dll из смеси, или я должен реализовать интерфейс ICommand илинекоторые другие решения.

Я хотел бы знать, есть ли сейчас какие-либо решения, которые не нуждаются в реализации ICommand или использовании сред, таких как MVVM Light.Я хотел бы использовать самое простое решение.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Почему вы так не любите использовать ICommand?Если вы собираетесь следовать шаблону MVVM, это идеальный способ добиться разделения между пользовательским интерфейсом и уровнями бизнес-логики.

Самая базовая реализация ICommand выглядит примерно так:

/// <summary>
/// a very simple ICommand implementation
/// </summary>
public class BasicCommand: ICommand
{
    private readonly Action _execute;

    public BasicCommand(Action execute)
    {
        _execute = execute;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        _execute?.Invoke();
    }

    public event EventHandler CanExecuteChanged;
}

Более продвинутые реализации ICommand, такие как MVVM-Light RelayCommand, также позаботятся об отключении любого связанного элемента управления (например, кнопки или элемента меню), как это требуется через механизм CanExecute, в гораздо большей степени.развязанный и более чистый способ, чем пытаться установить Button.InEnabled.

0 голосов
/ 19 ноября 2018

Возможно, вы захотите взглянуть на Caliburn.Micro . Это библиотека MVVM, которая позволяет вам определять методы без каких-либо команд в вашей модели представления и связываться с ними, используя соглашения об именах:

Просмотр модели:

public void Click() { /* handle */ }

Вид:

<Button Content="Click!" x:Name="Click" />

Другой вариант - добавить обработчик события click в класс code-behind вашего представления и оттуда вызвать метод модели представления:

private void Button_Click(object sender, RoutedEventArgs e) 
    => (DataContext as GeneralOptionsViewModel).Click();

Тогда вы не используете никаких команд, но сохраняете логику приложения в модели представления.

0 голосов
/ 17 ноября 2018

Почему вы хотите избежать ICommand?

Вы можете написать свою собственную реализацию ICommand, но это не нужно, когда MVVM Light имеет все инструменты и прост в использовании.

ЕслиВаше приложение очень простое, вы можете выбрать:

  1. Игнорировать шаблон MVVM и просто внедрить обработчики событий в коде

  2. (я предлагаю) ИспользоватьMVVM Light с реализацией ICommand по умолчанию

    public RelayCommand ExampleRelayCommand => new RelayCommand (ExampleMethod);

    private void ExampleMethod()
    {
    
    }
    
  3. Если вы хотите EventArgs, то вы можете реализовать триггеры интерактивностии EventToCommand с использованием PassEventArgsToCommand = "True" также с использованием MVVM Light

        public RelayCommand<RoutedEventArgs> EventRelayCommand => new RelayCommand<RoutedEventArgs>(EventRelayCommandMethod);
    
    private void EventRelayCommandMethod(RoutedEventArgs e)
    {
    
    }
    

Затем внутри кнопки в XAML:

<Button Grid.Column="0" Content="Example"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <command:EventToCommand Command="{Binding EventRelayCommand}" PassEventArgsToCommand="True" /> </i:EventTrigger> </i:Interaction.Triggers> </Button>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...