Создайте представление xamarin со сложной привязкой объекта - PullRequest
0 голосов
/ 02 июня 2019

Я использую XamarinForms и плагин ValidationRules.

У меня есть модель учетной записи, страница входа в которую связана с моделью viewview.И на моей странице входа я добавляю xamarin-представление FormEntry, которое имеет свойство привязки Validation типа Validatable<string>.

Свойство привязки имеет некоторые свойства, которые я хочу использовать: свойство Value, Error и hasError.Я помещаю привязку в мою учетную запись LoginPage, а затем привязка становится пустой в моем представлении содержимого FormEntry.Если я получу значение объекта проверки, оно будет нулевым в моем событии с текстовыми сообщениями.

Модель учетной записи

 public ValidatableObject<string> Password { get; set; }
 public ValidatableObject<string> Email { get; set; }
public Account()
{
    Password = new ValidatableObject<string>();
    Email = new ValidatableObject<string>();
}

private void AddValidations()
{
    // Email validations
    Email.Validations.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = C.T("Email is required.") });
    Email.Validations.Add(new EmailRule<string> { ValidationMessage = C.T("Email is not valid.") });

    //Password validations
    Password.Validations.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = C.T("A password is required.") });
    Password.Validations.Add(new LengthMinRule<string> { ValidationMessage = C.T("A password is required."), MinLength = 6 });
}

LoginPage

<local:FormEntry Validation="{Binding AccountInfo.Email}" Grid.Row="2" />

FormEntry Xaml

<ContentView.Resources>

 <converter:ErrorValidationColorConverter x:Key="errorValidationColorConverter" />
  <ResourceDictionary.MergedDictionaries>

   </ResourceDictionary.MergedDictionaries>

    </ContentView.Resources>

    <ContentView.Content>
<!--<border:SfBorder  Grid.Row="2"
        Style="{DynamicResource SfBorderStyle}"
        BorderColor="{Binding Source={x:Reference emailEntry}, Path=IsFocused, Converter={StaticResource errorValidationColorConverter}, ConverterParameter={x:Reference emailEntry}}">-->

<inputLayout:SfTextInputLayout x:Name="Input"  LeadingViewPosition="Outside" TrailingViewPosition="Outside" ContainerType="None">
    <Entry TextChanged="Entry_TextChanged" x:Name="entry"

                Placeholder="Email">
    </Entry>
    <inputLayout:SfTextInputLayout.LeadingView>
        <Label
   Text="&#xf007;"  FontFamily="{StaticResource FontAwesomeSolid}">
        </Label>
    </inputLayout:SfTextInputLayout.LeadingView>
    <inputLayout:SfTextInputLayout.TrailingView>
        <Label
  x:Name="LabelError"
                Text="&#xf06a;"
                FontFamily="{StaticResource FontAwesomeSolid}"
                TextColor="{DynamicResource ErrorColor}"
                FontSize="22">
        </Label>
    </inputLayout:SfTextInputLayout.TrailingView>
</inputLayout:SfTextInputLayout>
   <!--</border:SfBorder>-->
 </ContentView.Content>

My FormEntry cs

public FormEntry()
 {
     InitializeComponent();
  }

public ICommand ValidateUserNameCommand => new Command(() => 
ValidateField());

private bool ValidateField()
{
    return Validation.Validate();
}

public static readonly BindableProperty ValidationProperty = 
 BindableProperty.Create(
 propertyName: "Validation",
 returnType: typeof(ValidatableObject<string>),
  declaringType: typeof(FormEntry),
  defaultValue: default(ValidatableObject<string>));
  public ValidatableObject Validation
  {
get
{
  return (ValidatableObject)GetValue(ValidationProperty);
}
set
{
  SetValue(ValidationProperty, value);
}
}

protected override void OnPropertyChanged(string propertyName = null)
{
    base.OnPropertyChanged(propertyName);
    if (propertyName == ValidationProperty.PropertyName)
    {
        Input.ErrorText = Validation.Error;
        Input.HasError = Validation.Validate();
        entry.Text = Validation.Value;
        LabelError.IsVisible = Input.HasError;
    }
}

private void Entry_TextChanged(object sender, TextChangedEventArgs e)
{
    ValidateField();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...