Как я могу запустить некоторый код для запуска в представлении из модели представления? - PullRequest
0 голосов
/ 19 сентября 2018

Каков наилучший способ для модели представления «попросить» представление сделать что-либо (например, манипулировать элементами управления)?Я не думаю, что модель представления, отправляющая события, нарушает MVVM, поскольку в конце концов интерфейс INotifyPropertyChanged является примером моделей представления, отправляющих события представлениям.

Я понимаю, что наличие кода в представлении не считается идеальным с точки зрения MVVM, поэтому я мог бы использовать присоединенное поведение, например, для манипулирования определенным элементом управления, но проблема остается - как спросить присоединенное поведениесделать что-то с моей точки зрения модели?

Я мог бы иметь булево свойство зависимости в моем представлении с обработчиком события измененного свойства, который запускает код, который мне нужно запустить.Затем я мог бы связать это свойство со свойством в моей модели представления, а затем переключать значение этого свойства всякий раз, когда я хочу инициировать выполнение кода.Однако это выглядит как хак.

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

Это, должно быть, довольно распространенный сценарий, есть ли стандартные решения?

1 Ответ

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

Например, вы можете использовать агрегатор событий или мессенджер для отправки события или сообщения из модели представления, которое представление обрабатывает в слабосвязанной форме.И представление, и модель представления знают только о агрегаторе событий, но ничего не знают друг о друге.Пожалуйста, обратитесь к этому сообщению в блоге для получения дополнительной информации о концепции.

Другой распространенный подход - реализовать интерфейс в представлении и внедрить модель представления с этим интерфейсом, например:

public interface IDoSomething
{
    void DoSomething();
}

public partial class Window1 : Window, IDoSomething
{
    public Window1()
    {
        InitializeComponent();
        DataContext = new ViewModel(this);
    }

    public void DoSomething()
    {
        //do something...
    }
}

public class ViewModel
{
    public ViewModel(IDoSomething doSomething)
    {
        //...
    }
}

Это не нарушает шаблон MVVM, о котором знает модель представления, и зависит только от интерфейса.

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