Привязываемое свойство возвращает только значение по умолчанию

Я хочу создать пользовательский элемент управления (представление пользователя) в 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, если вы все равно собираетесь заменить контент.

Другие вопросы по тегам