Artyom 6d3f8ffb96 Add a TerminalScheduler, refactor things 4 роки тому
..
FodyWeavers.xml e5b0795aff Add files for the reactive example 4 роки тому
LoginView.cs 6d3f8ffb96 Add a TerminalScheduler, refactor things 4 роки тому
LoginViewModel.cs 6d3f8ffb96 Add a TerminalScheduler, refactor things 4 роки тому
Program.cs 6d3f8ffb96 Add a TerminalScheduler, refactor things 4 роки тому
README.md 7b199e8379 Add documentation 4 роки тому
ReactiveExample.csproj e5b0795aff Add files for the reactive example 4 роки тому
TerminalScheduler.cs 6d3f8ffb96 Add a TerminalScheduler, refactor things 4 роки тому

README.md

This is a sample app that shows how to use System.Reactive and ReactiveUI with Terminal.Gui. The app uses the MVVM architecture that may seem familiar to folks coming from WPF, Xamarin Forms, UWP, Avalonia, or Windows Forms. In this app, we implement the data bindings using ReactiveUI WhenAnyValue syntax and Pharmacist — a tool that converts all events in a NuGet package into observable wrappers.

Data Bindings

If you wish to implement OneWay data binding, then use the WhenAnyValue ReactiveUI extension method that listens to INotifyPropertyChanged events of the specified property, and converts that events into IObservable<TProperty>:

// 'usernameInput' is 'TextField' 
ViewModel
	.WhenAnyValue (x => x.Username)
	.BindTo (usernameInput, x => x.Text);

Note that your view model should implement INotifyPropertyChanged or inherit from a ReactiveObject. If you wish to implement OneWayToSource data binding, then install Pharmacist.MSBuild into your project and listen to e.g. TextChanged event of a TextField:

// 'usernameInput' is 'TextField'
usernameInput
	.Events () // The Events() extension is generated by Pharmacist.
	.TextChanged
	.Select (old => usernameInput.Text)
	.DistinctUntilChanged ()
	.BindTo (ViewModel, x => x.Username);

If you combine OneWay and OneWayToSource data bindings, you get TwoWay data binding. Also be sure to use the ustring type instead of the string type. Invoking commands should be as simple as this:

// 'clearButton' is 'Button'
clearButton
	.Events ()
	.Clicked
	.InvokeCommand (ViewModel, x => x.Clear);