Эквивалент обновлений модели привязки данных в модели 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 эквивалентный способ создания пользовательского интерфейса, который обновляет эти "вычисляемые свойства", когда пользователь вводит значения, аналогично тому, как представление с привязкой к данным с изменяемой моделью?
Я вижу два способа сделать это.
- В вашем
update
Функция, помимо обновления вновь введенных данных, также явно вычисляет производные данные. - В вашей привязке вычислите производные данные.