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.
- 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>