Я пытаюсь реализовать маску для адаптации ввода моего номера телефона, но я собираю поведение из страны, которую выбрал пользователь.
<Entry Keyboard="Numeric" Placeholder="Telephone Number" BackgroundColor="#FFFFFF" IsSpellCheckEnabled="True">
<Entry.Behaviors>
<behaviors:MaskedBehavior Mask="{Binding SelectedCountry.Mask}" />
</Entry.Behaviors>
</Entry>
Но когда значение будет работать Поведение: что-то идет не так.
public class MaskedBehavior : Behavior<Entry>
{
private string _mask = "(XXX) XXXX XXXX";
public static readonly BindableProperty MaskProperty =
BindableProperty.Create("Mask", typeof(string), typeof(MaskedBehavior),
null, BindingMode.TwoWay, null, propertyChanged: OnItemsSourceChanged);
static void OnItemsSourceChanged(BindableObject bindable, object oldValue, object newValue)
{
var control = (MaskedBehavior)bindable;
control.Mask = (string)newValue;
}
public string Mask
{
get { return (string)GetValue(MaskProperty); }
set
{
SetValue(MaskProperty, _mask);
SetPositions();
}
}
private void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
var entry = sender as Entry;
var text = entry.Text;
if (string.IsNullOrWhiteSpace(text) || _positions == null)
return;
if (text.Length > _mask.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;
}
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(Mask))
{
_positions = null;
return;
}
var list = new Dictionary<int, char>();
for (var i = 0; i < Mask.Length; i++)
if (Mask[i] != 'X')
list.Add(i, Mask[i]);
_positions = list;
}
Список источников подобен этому, я просто что-то придумал, но после того, как собираюсь исправить его как правильное.
**Xaml**
<Picker HeightRequest ="40"
WidthRequest="300"
Title="Country/Region"
ItemsSource="{Binding Countries}"
ItemDisplayBinding="{Binding CountryName}"
SelectedItem="{Binding SelectedCountry}"
**C#**
static CountriesData()
{
Countries = new List<Country>();
Countries.Add(new Country
{
Id = "93",
CountryName = "Afghanistan (+93)",
Mask = "(XXX) XXXX XXXX"
});
Countries.Add(new Country
{
Id = "335",
CountryName = "Albania (+355)",
Mask = "(XXX) XXXX XXX"
});
}
Если кто-то может дать руку, пожалуйста =) Извините, это мой первый проект, если я не express мне правильный путь = /