Germán Küber

Microsoft Architect

Bindear Propiedad de ViewModel a un Behavior (IsValid)

El siguiente ejemplo muestra la manera de crear un Behavior en Xaml y pasarle una propiedad de nuestro ViewModel. Esta propiedad sera modificada desde adentro del Behavior con el objetivo de mantener actualizado nuestro ViewModel indicándonos si el estado de este es valido o no.

  1. Creo un Behavior
using System;
using Xamarin.Forms;

namespace Remember.BehaviorCustoms
{
    public class EntryNotNullBehavior : Behavior<Entry>
    {
        public static readonly BindableProperty IsValidProperty = BindableProperty.Create(nameof(IsValid), typeof(bool), typeof(EntryNotNullBehavior), true, BindingMode.TwoWay);

        public bool IsValid
        {
            get { return (bool)GetValue(IsValidProperty); }
            set { SetValue(IsValidProperty, value); }
        }

        private void OnTextChanged(object sender, TextChangedEventArgs args)
        {
            var entry = (Entry)sender;
            IsValid = !string.IsNullOrEmpty(args.NewTextValue);
            entry.BackgroundColor = IsValid ? Color.Green : Color.Red;
        }

        protected override void OnAttachedTo(Entry bindable)
        {
            base.OnAttachedTo(bindable);
            bindable.TextChanged += OnTextChanged;
            //Este es el tema, hay que colocar en contexto el behavior
            bindable.BindingContextChanged += OnBindingContextChanged;
        }

        protected override void OnDetachingFrom(Entry bindable)
        {
            base.OnDetachingFrom(bindable);
            bindable.TextChanged -= OnTextChanged;
            bindable.BindingContextChanged -= OnBindingContextChanged;
        }

        private void OnBindingContextChanged(object sender, EventArgs eventArgs)
        {
            BindingContext = ((BindableObject)sender).BindingContext;
        }
    }
}

2. Creo el ViewModel

namespace XamApp.ViewModels
{
	public class BehaviorsExampleViewModel : ViewModelBase
	{
		private bool isVMValid = true;

		public bool IsVMValid
		{
			get { return isVMValid; }
			set { SetProperty(ref isVMValid, value); }
		}

		public BehaviorsExampleViewModel() { }
	}
}

3. Desde mi View, utilizo el Behavior y le paso como parámetro mi propiedad de modelo.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage 
  xmlns="http://xamarin.com/schemas/2014/forms"
  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
  xmlns:viewModels="clr-namespace:XamApp.ViewModels;assembly=XamApp"
  xmlns:behaviors="clr-namespace:XamApp.Behaviors;assembly=XamApp"
  x:Class="XamApp.Views.BehaviorsExampleView">
  <ContentPage.BindingContext>
    <viewModels:BehaviorsExampleViewModel x:Name="ViewModel"/>
  </ContentPage.BindingContext>
  <ContentPage.Content>
    <StackLayout Margin="10, 5, 10, 5" Orientation="Vertical">
	  <Label Text="Nombre" FontSize="Small"/>
        <Entry Text="{Binding Nombre}">
		  <Entry.Behaviors>
			<behaviors:EntryNotNullBehavior IsValid="{Binding IsVMValid, Mode=TwoWay}"/>
		  </Entry.Behaviors>
		</Entry>
	  <Button Text="Active if IsVMValid" IsEnabled="{Binding IsVMValid, Mode=TwoWay}"/>
	</StackLayout>
  </ContentPage.Content>
</ContentPage>

 

 

Translate »