Привязываемое свойство возвращает только значение по умолчанию
Я хочу создать пользовательский элемент управления (представление пользователя) в xamarin.forms. Мой контроль имеет одно свойство. Элемент управления выбирает, какой элемент будет добавлен на страницу (элемент или метка). Для этого я использую BindableProperty, но он возвращает только значение по умолчанию. Я не понимаю, что не так?
Вот мой код контроля пользователя:
public partial class UserView : ContentView
{
public UserView()
{
InitializeComponent();
StackLayout stackLayout = new StackLayout();
if (TypeElement == "label") //TypeElement return only "default value"
stackLayout.Children.Add(new Label { Text = "LABEL" });
else
stackLayout.Children.Add(new Entry { Text = "ENTRY" });
Content = stackLayout;
}
public static readonly BindableProperty TypeProperty = BindableProperty.CreateAttached("TypeElement", typeof(string), typeof(UserView), "default value");
public string TypeElement
{
get
{
return (string)GetValue(TypeProperty);
}
set
{
SetValue(TypeProperty, value);
}
}
}
Здесь я использую свой контроль на странице:
1 ответ
Ваше свойство TypeElement устанавливается после завершения конструктора, вы должны следить за изменением этого свойства, а затем делать то, что вам нужно, например:
public static readonly BindableProperty TypeProperty = BindableProperty.CreateAttached("TypeElement", typeof(string), typeof(UserView), "default value", propertyChanged:OnTypeElementChanged);
private static void OnTypeElementChanged(BindableObject bindable, object oldValue, object newValue)
{
var userView = bindable as UserView;
StackLayout stackLayout = new StackLayout();
if (userView.TypeElement == "label") //TypeElement return only "default value"
stackLayout.Children.Add(new Label { Text = "LABEL" });
else
stackLayout.Children.Add(new Entry { Text = "ENTRY" });
userView.Content = stackLayout;
}
Я проверил это, и это работает, однако есть несколько вещей, которые меня смущают в реализации, например, почему вы используете присоединенное свойство вместо обычного привязываемого свойства, а также почему у вас, похоже, есть файл XAML, связанный с UserView, если вы все равно собираетесь заменить контент.