Текст метки не обновляется из привязываемого свойства

У меня есть очень простая форма, которую я использую для экспериментов с BindableProperty. Вот XAML для формы

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyBindableProperty"
             x:Class="MyBindableProperty.MainPage">
  <StackLayout>
    <local:MyLabel x:Name="BindingLabel" Text="{Binding Text}" MyText="{Binding Text}"
             VerticalOptions="Center"
             HorizontalOptions="Center" />
    <Entry x:Name="BindingEntry" Text="{Binding Text, Mode=TwoWay}"/>
    <Entry x:Name="BindingEntry2" Text="{Binding Text, Mode=TwoWay}"/>
    <Button x:Name="BindingButton" Text="Reset"/>
  </StackLayout>
</ContentPage>

И вот код позади

    public partial class MainPage : ContentPage
    {
        public DataSourceClass DataSourceObject { get; set; }

        public MainPage()
        {
            DataSourceObject = new DataSourceClass { Text = "Test1" };
            BindingContext = DataSourceObject;

            InitializeComponent();
            BindingButton.Clicked += BindingButton_Clicked;
        }

        private void BindingButton_Clicked(object sender, EventArgs e)
        {
            var boundText = this.BindingLabel.Text;
            var boundMyText = this.BindingLabel.MyText;
            DataSourceObject.Text = "Test2";
        }
    }

Наконец, вот пользовательский класс меток, используемый в XAML -

public class MyLabel : Label
{

    public string MyText
    {
        get
        {
            return (string)GetValue(MyTextProperty);
        }
        set
        {
            SetValue(MyTextProperty, value);
        }
    }

    public static readonly BindableProperty MyTextProperty = BindableProperty.Create(nameof(MyText), typeof(string), typeof(MyLabel), "Test", BindingMode.TwoWay, propertyChanged: MyTextChanged);

    public static void MyTextChanged(BindableObject bindable, object oldValue, object newValue)
    {
        ((MyLabel)bindable).TextChanged(newValue.ToString());
    }

    public void TextChanged(string newText)
    {
        Device.BeginInvokeOnMainThread(() => this.Text = newText);
    }
}

У меня возникают проблемы, когда страница инициализирует обработчик MyTextChanged, но не после каких-либо последующих изменений, когда нажимается кнопка "Сброс", значение в DataSourceObject.Text корректно обновляется значением из элемента Entry, независимо от того, как я пытаюсь установите значения BindingLabel и BindingEntry2, они никогда не отражают значения DataSourceObject.Text после загрузки страницы.

Любая помощь будет принята с благодарностью.

1 ответ

Я наткнулся на это, поэтому я обновил DataSourceClass из этого

public  class DataSourceClass
{
    public string Text { get; set; }
}

к этому

public class DataSourceClass : INotifyPropertyChanged
{
    private string _text;
    public string Text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Text"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

и теперь все работает.

я думал BindableProperty должен был заменить INotifyPropertyChanged?

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