Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Can you provide an example of two-way binding in MvvmCross for Android


Can you provide an example of two-way binding in MvvmCross for Android


Two-Way Binding in MvvmCross for Android

Two-way binding in MvvmCross allows for automatic synchronization of data between the View and ViewModel. This is particularly useful when collecting user input or editing existing data. Here's a detailed example of how to implement two-way binding in an Android application using MvvmCross.

Step 1: Setting Up the Project

First, ensure you have MvvmCross installed in your project. You can add it via NuGet Package Manager or by using the Package Manager Console with the command:

bash
Install-Package MvvmCross

Step 2: Creating the ViewModel

Create a ViewModel that will hold the data you want to bind. For example:

csharp
using MvvmCross.ViewModels;

namespace TipCalc.Core
{
    public class TipViewModel : MvxViewModel
    {
        private string _subTotal;
        public string SubTotal
        {
            get => _subTotal;
            set => SetProperty(ref _subTotal, value);
        }

        // Other properties and logic...
    }
}

Step 3: Creating the View

In your Android project, create an Activity that will serve as the View. Use the `MvxActivity` class to enable MvvmCross functionality:

csharp
using Android.App;
using Android.OS;
using MvvmCross.Platforms.Android.Views;

namespace TipCalc.Droid
{
    [Activity(Label = "Tip Calculator")]
    public class TipView : MvxActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.tip_view);
        }
    }
}

Step 4: Defining the Layout

In your layout file (`tip_view.axml`), add controls and use the `MvxBind` attribute to bind them to ViewModel properties. For two-way binding, ensure that the control can notify MvvmCross of changes, typically through events.

xml


    

In this example, the `EditText` control is bound to the `SubTotal` property of the ViewModel using two-way binding by default.

Step 5: Handling Custom Controls

If you're using a custom control that doesn't support two-way binding out of the box, you might need to create a custom binding. This involves creating a `TargetBinding` class that listens for changes on the control and updates the ViewModel accordingly.

For example, if you have a custom control that doesn't notify MvvmCross of changes, you can create a custom binding like this:

csharp
using MvvmCross.Binding.Bindings.Target;

public class CustomEditTextTargetBinding : MvxTargetBinding
{
    private EditText _editText;

    public CustomEditTextTargetBinding(EditText editText)
    {
        _editText = editText;
    }

    public override void SubscribeToEvents()
    {
        _editText.TextChanged += OnTextChanged;
    }

    private void OnTextChanged(object sender, Android.Text.TextChangedEventArgs e)
    {
        FireValueChanged(e.Text.ToString());
    }

    public override Type TargetType => typeof(string);

    public override MvxBindingMode DefaultMode => MvxBindingMode.TwoWay;

    protected override void SetValueImpl(object target, object value)
    {
        _editText.Text = (string)value;
    }

    protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            _editText.TextChanged -= OnTextChanged;
        }
        base.Dispose(isDisposing);
    }
}

Then, you need to register this binding in your `Setup.cs` file:

csharp
using MvvmCross.Binding.Bindings.Target;

public class Setup : MvxAndroidSetup
{
    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories(registry);
        registry.RegisterCustomBindingFactory("CustomEditText", (view) => new CustomEditTextTargetBinding((EditText)view));
    }
}

Step 6: Using the Custom Binding

Finally, you can use the custom binding in your layout:

xml

This setup ensures that changes to the `EditText` control are reflected in the ViewModel and vice versa.

Conclusion

Two-way binding in MvvmCross for Android simplifies the process of synchronizing data between the UI and the business logic. By leveraging MvvmCross's default two-way binding capabilities and creating custom bindings when necessary, you can efficiently manage complex UI interactions.

Citations:
[1] https://www.mvvmcross.com/documentation/tutorials/tipcalc/a-xamarinandroid-ui-project
[2] https://stackoverflow.com/questions/17156368/
[3] https://www.mvvmcross.com/documentation/fundamentals/data-binding
[4] https://learn.microsoft.com/en-us/archive/msdn-magazine/2014/august/windows-phone-build-mvvm-apps-with-xamarin-and-mvvmcross
[5] https://www.mvvmcross.com/documentation/advanced/custom-data-binding
[6] https://stackoverflow.com/questions/10495137/mvvmcross-bindings-in-android
[7] http://stackoverflow.com/questions/10700445/in-mvvmcross-how-do-i-do-custom.-bind-properties
[8] https://developer.android.com/topic/libraries/data-binding/two-way