Как упростить привязки, которые зависят друг от друга? - PullRequest
1 голос
/ 22 февраля 2020

У меня есть запись, которую я хочу выделить красным, когда запись пуста. Я использую SyncFusion SFTextInputLayout для своей записи, и у него есть свойство "HasError", которое после установки значения true автоматически выделяет все мое значение красным цветом.

Вот следующий код XAML для SFTextInputLayout

 <inputLayout:SfTextInputLayout Grid.Column="0" Hint="Phone Number" ContainerType="{StaticResource RepairOrderContainerType}" HasError="{Binding IsPhoneNumberError}" FocusedColor="{StaticResource AccentColor}" VerticalOptions="Center" HorizontalOptions="Start">
       <Entry Keyboard="Telephone" Style="{StaticResource TextInputStyle}" Text="{Binding PhoneNumber}"/>
 </inputLayout:SfTextInputLayout>

Как видите, у меня есть две привязки, которые обрабатывают текст записи, и еще одна, чтобы проверить, есть ли в ней ошибка или нет. Несмотря на то, что это решение работает, оно станет избыточным довольно скоро, когда число моих полей ввода увеличится. Для каждого поля ввода мне нужно другое логическое значение, чтобы покрыть его свойство Error, как показано ниже.

  private string _phoneNumber;
    public string PhoneNumber
    {
        get => _phoneNumber;
        set
        {
            IsPhoneNumberError = string.IsNullOrWhiteSpace(value) ? true : false;
            this.RaiseAndSetIfChanged(ref _phoneNumber, _phoneNumber);
        }
    }

    private bool _isPhoneNumberError = false;
    public bool IsPhoneNumberError
    {
        get => _isPhoneNumberError;
        set
        {
            this.RaiseAndSetIfChanged(ref _isPhoneNumberError, value);
        }
    }

Мне интересно, есть ли способ упростить этот код. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете выполнить требование обработки ошибки при добавлении нескольких полей ввода, привязав текст записи к свойству HasError и используя конвертер, как показано в фрагментах кода ниже.

Фрагменты кода [Xaml]:

<StackLayout > 
    <inputLayout:SfTextInputLayout 
       Grid.Column="0" 
       HasError="{Binding Text,Source={x:Reference entry1}, Converter={StaticResource Converter}}" 
       Hint="Phone Number" 
       HorizontalOptions="Start" 
       VerticalOptions="Center"> 
       <Entry x:Name="entry1" Keyboard="Telephone" Text="{Binding PhoneNumber}" /> 
    </inputLayout:SfTextInputLayout> 

    <inputLayout:SfTextInputLayout 
       Grid.Column="0" 
       HasError="{Binding Text,Source={x:Reference entry2}, Converter={StaticResource Converter}}" 
       Hint="Address" 
       HorizontalOptions="Start" 
       VerticalOptions="Center"> 
       <Entry x:Name="entry2" Text="{Binding Address}" /> 
    </inputLayout:SfTextInputLayout> 
</StackLayout> 

Фрагменты кода [C #]:

public class Converter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
        if (value != null) 
        { 
            return string.IsNullOrEmpty(value.ToString()) ? true : false; 
        } 

        return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
        return value; 
    } 
} 

Образец: https://www.syncfusion.com/downloads/support/directtrac/general/ze/TextInputLayout-1703941642.zip

1 голос
/ 23 февраля 2020

Один из многих способов сделать это sh - это создать собственный элемент управления с поведением.

создать собственный элемент управления:

public class MySfTextInputLayout : SfTextInputLayout
{

    public MySfTextInputLayout ()
    {
        Behaviors.Add(new ShowErrorBehavior());
    }
    public bool HasErrors
    {
        get { return (bool)GetValue(HasErrorsProperty); }
        set { SetValue(HasErrorsProperty, value); }
    }
    public static readonly BindableProperty HasErrorsProperty =
        BindableProperty.Create(nameof(HasErrors), typeof(bool), typeof(MySfTextInputLayout ), false);

}

и поведение:

public class ShowErrorBehavior : Behavior<MySfTextInputLayout>
{
    protected override void OnAttachedTo(MySfTextInputLayout entry)
    {
        entry.TextChanged += OnEntryTextChanged;
        base.OnAttachedTo(entry);
    }
    protected override void OnDetachingFrom(MySfTextInputLayout entry)
    {
        entry.TextChanged -= OnEntryTextChanged;
        base.OnDetachingFrom(entry);
    }

    void OnEntryTextChanged(object sender, TextChangedEventArgs args)
    {
        ((MySfTextInputLayout)sender).HasErrors = string.IsNullOrWhiteSpace(args.NewTextValue);
    }
}

Поведение будет определять правильность текста для вас, поэтому вам не нужно связываться с другим свойством только для этого. Также взгляните на API проверки, вы можете добавить несколько правил для записи, которая будет действительной:

https://devblogs.microsoft.com/xamarin/validation-xamarin-forms-enterprise-apps/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...