Как отформатировать номер телефона со значением по умолчанию в формах xamarin - PullRequest
1 голос
/ 01 апреля 2019

Я использовал форматирование номера телефона в зависимости от типа элемента, выбранного в поле со списком.Он отлично работает для нового типа.Но когда мы перезагружаем / редактируем существующий номер телефона, номер телефона не форматируется и не виден.Я реализовал форматирование номера телефона на основе указанной ниже ссылки. Пожалуйста, дайте ценные советы, чтобы сделать это.

Пожалуйста, обратитесь по ссылке

MyView.xaml

<Entry x:Name="phoneEntry" Placeholder="Phone Number" FontSize="14" PlaceholderColor="Gray" Text="{Binding Number, Mode=TwoWay}" HorizontalOptions="FillAndExpand" Keyboard="Telephone">                                                        
  <Entry.Behaviors>                                                            
       <buttonBehavior:EntryBehavior CommandParameter="{x:Reference phoneFormat}" />
  </Entry.Behaviors>
</Entry>

EntryBehavior.cs

public class EntryBehavior : Behavior<Entry>, INotifyPropertyChanged
{
        public object CommandParameter
        {
            get { return (object)GetValue(CommandParameterProperty); }
            set { SetValue(CommandParameterProperty, value); }
        }
        // Using a DependencyProperty as the backing store for CommandParameter.  This enables animation, styling, binding, etc...
        public static readonly BindableProperty CommandParameterProperty =
            BindableProperty.Create("CommandParameter", typeof(object), typeof(EntryBehavior));

        private string format = "";
        public string Format
        {
            get => format;
            set { format = value; OnPropertyChanged(); SetPositions(); }
        }

        protected override void OnAttachedTo(Entry entry)
        {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);          
        }

        protected override void OnDetachingFrom(Entry entry)
        {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }

        IDictionary<int, char> _positions;

        void SetPositions()
        {
            if (string.IsNullOrEmpty(Format))
            {
                _positions = null;
                return;
            }

            var list = new Dictionary<int, char>();
            for (var i = 0; i < Format.Length; i++)
                if (Format[i] != 'X')
                    list.Add(i, Format[i]);

            _positions = list;
        }

        private void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        {
            if (CommandParameter != null && CommandParameter is SfComboBox)
            {
                int index = (CommandParameter as SfComboBox).SelectedIndex;
                if (index == 0)
                    Format = "(XXX) XXX-XXXX";
                else if (index == 1)
                    Format = "X(XXX) XXX-XXXX";
                else
                    Format = "";
            }

            var entry = sender as Entry;

            var text = entry.Text;

            if (string.IsNullOrWhiteSpace(text) || _positions == null)
                return;

            if (text.Length > format.Length)
            {
                entry.Text = text.Remove(text.Length - 1);
                return;
            }

            foreach (var position in _positions)
                if (text.Length >= position.Key + 1)
                {
                    var value = position.Value.ToString();
                    if (text.Substring(position.Key, 1) != value)
                        text = text.Insert(position.Key, value);
                }

            if (entry.Text != text)
                entry.Text = text;
        }
}

MyViewViewModel.cs

public MyViewViewModel
{
   PhoneFormat = "Type 1";
   Number = "(134) 234-3453";
}

На основеPhoneFormatType номер телефона отформатирован в поведении записи.Если Тип 1 означает (XXX) XXX-XXXX, а Тип 2 означает X (XXX) XXX-XXXX.

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