Эквивалент обновлений модели привязки данных в модели Elm-view-update-update - PullRequest
0 голосов
/ 07 января 2019

Изменения состояния MVU

Как я понимаю, в моделях Elm-style-view-update-update изменения в состоянии приложения следуют после отправки сообщения, которое определяет обновленное состояние. Здесь состояние является неизменным, поэтому изменения приводят к совершенно новому набору состояния приложения.

Например, ниже (взято из проекта Fabulous ) сообщение Pressed приводит к изменению состояния Model.Pressed на true.

Я полагаю, что сообщение будет отправлено в результате явного действия пользователя, такого как нажатие кнопки "Отправить" или "Сохранить".

/// The messages dispatched by the view
type Msg =
    | Pressed

/// The model from which the view is generated
type Model =
    { Pressed: bool }

/// Returns the initial state
let init() = { Pressed = false }

/// The function to update the view
let update (msg: Msg) (model: Model) =
    match msg with
    | Pressed -> { model with Pressed = true }

/// The view function giving updated content for the page
let view (model: Model) dispatch =
    if model.Pressed then
        View.Label(text="I was pressed!")
    else
        View.Button(text="Press Me!", command=(fun () -> dispatch Pressed))

type App () as app =
    inherit Application ()

    let runner =
        Program.mkSimple init update view
        |> Program.withConsoleTrace
        |> Program.runWithDynamicView app

Изменения состояния привязки данных

Допустим, у вас есть модель в WPF, возможно, которая реализует INotifyPropertyChanged и использует привязку данных для привязки вашего состояния к пользовательскому интерфейсу. Таким образом, состояние здесь изменчиво и со временем изменится.

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

public class PersonView: INotifyPropertyChanged
{
    private DateTime _birthday;
    public DateTime Birthday
    {
        get { return _birthday; }
        set
        {
            _birthday = value;
            PropertyChanged("Birthday");
            Age = CalculateAgeFromBirthday();
        }
    }

    private int _age;
    public int Age
    {
        get { return _age; }
        private set
        {
            _age = value;
            PropertyChanged("Age");
        }
    }

    void PropertyChanged(string property)
    {
        // Etc.
    }

    int CalculateAgeFromBirthday()
    {
        // Do you sums here;
    }
}

Вопрос

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

...