Xamawin • zam-ah win | noun
A quick, easy to implement enhancement for a Xamarin App that improves performance, appearance, or functionality
Behaviors are super easy to make and offer a lot of bang for your buck – here’s a small example of a behavior I used recently to highlight incomplete/invalid user entry fields:
public class EntryLengthValidator : Behavior<Entry> { public int MaxLength { get; set; } public int MinLength { get; set; } = 0; protected override void OnAttachedTo(Entry bindable) { base.OnAttachedTo(bindable); bindable.TextChanged += OnEntryTextChanged; } protected override void OnDetachingFrom(Entry bindable) { base.OnDetachingFrom(bindable); bindable.TextChanged -= OnEntryTextChanged; } void OnEntryTextChanged(object sender, TextChangedEventArgs e) { var entry = (Entry)sender; // if Entry text is longer than valid length if (entry.Text.Length > this.MaxLength) { string entryText = entry.Text; entryText = entryText.Remove(entryText.Length - 1); // remove last char entry.Text = entryText; } if (MinLength > 0) if (entry.Text.Length < this.MinLength) { ((Entry)sender).TextColor = Color.Red; } else ((Entry)sender).TextColor = Color.Black; } }
Notice that the minimum length is optional, but the max length is not – we trim any additional input after reaching the max character limit. Don’t forget to define your namespace first before adding the behavior to any entry field:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:behaviors="clr-namespace:CrmApp.Mobile.Behaviors" <!-- More stuff --> <AbsoluteLayout> <Label Text="Zip Code:" AbsoluteLayout.LayoutBounds="0,20,.3,40" AbsoluteLayout.LayoutFlags="WidthProportional" /> <Entry Text="{Binding ZipCode}" AbsoluteLayout.LayoutBounds="1,10,.75,40" AbsoluteLayout.LayoutFlags="XProportional,WidthProportional"> <Entry.Behaviors> <behaviors:EntryLengthValidatorBehavior MaxLength="10" MinLength="5"/> <!-- More behaviors --> </Entry.Behaviors> </Entry> </AbsoluteLayout>
The result looks like this:
We could also attach other behaviors to validate Zip Codes specifically (potentially including any input masking and format validation), but I wanted to keep the length validator generic enough for almost any field.
Enjoy!