Свойства типа не будут обновляться значениями из XAML, пока не вернется конструктор для типа, поэтому вы хотите запустить CheckValidity
после того, как конструктор вернется.
Самый простой и быстрый способ сделать это - запустить фоновый поток для запуска CheckValidity
, так как это позволит методу конструктора вернуть и заполнить свойства значениями, установленными в XAML.Поэтому попробуйте следующее:
public ValidatingEntry()
{
InitializeComponent();
entry.SetBinding(Entry.TextProperty, new Binding("Text", source: this));
Task.Run(() => {
CheckValidity();
UpdateMessage();
});
entry.Unfocused += (sender, e) =>
{
CheckValidity();
UpdateMessage();
};
}
Стоит отметить, что это не только для форм.В конструкторе по умолчанию (без параметров) только свойства, для которых заданы значения по умолчанию, будут уже установлены при работе конструктора.Поэтому, если вы хотите, чтобы значением по умолчанию было true
, задайте значение по умолчанию в вызове метода BindableProperty.Create(...)
для свойства Required
, например:
public static readonly BindableProperty RequiredProperty =
BindableProperty.Create(
"Required",
typeof(bool),
typeof(ValidatingEntry),
true);
В качестве примера можно подумать, что когдавы делаете это:
var x = new MyType { MyString = "New text" };
Это MyString
будет установлено в конструкторе, но это не так.Выше приведен синтаксический сахар, который изменяется во время компиляции до эквивалента:
var x = new MyType();
x.MyString = "New text";
Итак, конструктор завершается, и затем свойство устанавливается.
Однако, если у вас есть значение по умолчанию, например:
public class MyType
{
public string MyString { get; set; } = "Default text";
}
MyString
будет установлено в «Текст по умолчанию» и будет доступно в конструкторе.
Пример консольного приложения для демонстрации:
class MainClass
{
public static void Main(string[] args)
{
var x = new MyType { MyString = "New text" };
var y = Console.ReadKey();
}
}
public class MyType
{
public MyType()
{
Console.WriteLine($"Constructor: {MyString}");
Task.Run(() => Console.WriteLine($"Task: {MyString}"));
}
public string MyString { get; set; } = "Default text";
}
Вывод будет:
Конструктор: Текст по умолчанию
Задача: Новый текст