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