Обработка событий в MVVM

183
18 ноября 2021, 21:50

Моя цель - обработать событие загрузки приложения, при этом применяя паттерн MVVM.

  1. Насколько допустимо обработать его просто запихав обработчик в cs код окна?

  2. Возможно ли обрабатывать такие события с помощью команд? Если да, то как? Все примеры команд которые я просматривал срабатывали лишь при клике.

  3. Есть ли какой-то другой способ обработать события не нарушая "заповедей" MVVM?

Answer 1

Нужно подключить в xaml

xmlns:intr="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

и привязать событие загрузки к своему свойству

<Grid>
    <intr:Interaction.Triggers>
        <intr:EventTrigger EventName="Loaded">
            <intr:InvokeCommandAction Command="{Binding WindowLoaded}"/>
        </intr:EventTrigger>
    </intr:Interaction.Triggers>
</Grid>

cs

public class TestViewModel 
{
   public ICommand WindowLoaded { get; set; }
    public TestViewModel()
    {
        WindowLoaded = new RelayCommand(Load);
    }
    private void Load(object obj)
    {
        MessageBox.Show("Загрузка");
    }
}

RelayCommand

/// <summary>
/// Класс описывающий реализацию интерфейса ICommand, для связываний событий из XML и кодом C#
/// </summary>
public class RelayCommand : ICommand 
{
    /// <summary>
    /// делегат, который будет выполнять действие
    /// </summary>
    private readonly Action<object> _execute;
    /// <summary>
    /// делеагат, который будет проверять разрешение на выполнение команды
    /// </summary>
    private readonly Func<object, bool> _canExecute;
    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }
    /// <summary>
    /// можно ли выполнять команду или нет
    /// </summary>
    /// <param name="parameter">функция, в которой происходит проверка на выполнение</param>
    /// <returns>можно или нет выполнить(true или false)</returns>
    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }
    /// <summary>
    /// выполнение команды
    /// </summary>
    /// <param name="parameter">функция, которая будет выполняться</param>
    public void Execute(object parameter)
    {
        _execute(parameter);
    }
    /// <summary>
    ///  добавления и удаления подписчика 
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}
READ ALSO
Установка image через Uri Xamain

Установка image через Uri Xamain

Есть приложение написанное на C# Xamarin (Android, IOS)Необходимо показывать изображение которое распологается на сайте

140
Сессия для языкового переключателя

Сессия для языкового переключателя

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

69
Команда shell_exec php выполняется 2 раза, почему?

Команда shell_exec php выполняется 2 раза, почему?

Странное поведение команды shell_exec: при выполнении она выполняется 2 раза

176
messages.getHistory не возвращает непрочитанные сообщения

messages.getHistory не возвращает непрочитанные сообщения

Появилась проблема с vk apiМетод messages

95