none
Como crear un CustomControl en Xamarin con propiedades y eventos RRS feed

  • Pregunta

  • Hola

    Estoy implementando validaciones en Xamarin implementando el método mencionado en los siguientes enlaces:

    https://docs.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/validation
    https://devblogs.microsoft.com/xamarin/validation-xamarin-forms-enterprise-apps/

    El punto es que para cada input a validar debo agregar un framento de código similar a:

    <custom:CustomEntry x:name="Entry" Text="{Binding NameRoutine.Value, Mode=TwoWay}" Placeholder="{i18n:Translate NAME}" Style="{StaticResource ControlEntry}">
                                        <Entry.Behaviors>
                                            <b:EventToCommandBehavior EventName="TextChanged" Command="{Binding ValidateRoutineNameCommand}" />
                                        </Entry.Behaviors>
                                        <Entry.Triggers>
                                            <DataTrigger TargetType="Entry" Binding="{Binding NameRoutine.IsValid}" Value="False">
                                                <Setter Property="Style" Value="{StaticResource ControlEntryError}" />
                                            </DataTrigger>
                                        </Entry.Triggers>
                                    </custom:CustomEntry>
                                    <Label Text="{Binding NameRoutine.Errors, Converter={StaticResource FirstValidationErrorConverter}}" Style="{StaticResource ValidationError}" />

    Donde NameRoutine es igual a una propiedad del tipo ValidatableObject<T> en mi ViewModel. 

    Lo que quiero evitar es encapsular todo esto en una "CustomControl" y tengo entendido que para ello en Xamarin debo usar el ContentView:

    Pregunta 1:
    Como puedo hacer que el binding del ContentView haga referencia a las propiedades contenidas en mi ContentView.xaml.cs y no al ViewModel.

    Pregunta 2:
    En caso que la primera pregunta no se pueda hacer, estoy probando crear propiedades dentro del ContentView de la siguiente forma:

    public static readonly BindableProperty ValueProperty = BindableProperty.Create(
                                                                             propertyName: "Value",
                                                                             defaultValue: String.Empty,
                                                                             returnType: typeof(string),
                                                                             declaringType: typeof(EntryValidation),
                                                                             defaultBindingMode: BindingMode.TwoWay,
                                                                             propertyChanged: ValuePropertyChanged);
            public string Value
            {
                get { return base.GetValue(ValueProperty).ToString(); }
                set { base.SetValue(ValueProperty, value); }
            }
            private static void ValuePropertyChanged(BindableObject bindable, object oldValue, object newValue)
            {
                var speakerControl = (EntryValidation)bindable;
                if(newValue != null)
                    speakerControl.Entry.Text = newValue.ToString();
            }

    Esto funciona, en el ejemplo anterior asigno el texto al entry, el problema es con las propiedades que no son del tipo string. En este caso deben ser del tipo ValidatableObject<T>. Es una propiedad con un objeto genérico y no sabría como crearla.

    También intenté crear varias propiedades; una para el Texto, otra para el evento del EventToCommandBehavior, etc. Pero no se como asignar una para el DataTrigger por ejemplo. En el DataTrigger tendría que asignar el Binding que es una especie de evento. PEro NameRoutine.IsValid es un tipo bool.

    Saludos
    viernes, 27 de diciembre de 2019 18:58