Эквивалент обновлений модели привязки данных в модели Elm-view-update-update

MVU State Changes

Как я понимаю, в моделях Elm-style-view-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;
    }
}

Вопрос

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

0 ответов

Допустим, у вас есть модель в WPF...

Если вы хотите использовать Elmish с WPF, я рекомендую использовать Elmish.WPF. Репо содержит множество примеров, которые отлично подходят для быстрого понимания.

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

Я вижу два способа сделать это.

  1. В вашем update Функция, помимо обновления вновь введенных данных, также явно вычисляет производные данные.
  2. В вашей привязке вычислите производные данные.
Другие вопросы по тегам