Почему Xamarin ничего не отображает, когда я пытаюсь получить доступ к свойству связанного объекта?

#c# #xaml #xamarin #data-binding #binding

#c# #xaml #xamarin #привязка данных #привязка

Вопрос:

Здесь представлена одна из страниц моего приложения Xamarin MVVM. Его код XAML выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage ...>
    <ContentPage.Content>
        <RefreshView Command="{Binding Load}" IsRefreshing="{Binding IsBusy, Mode=TwoWay}">
           <ScrollView>
              <Label Text="{Binding MyClass.MyProperty}"/>    
           </ScrollView>
        </RefreshView>
    </ContentPage.Content>
</ContentPage>
 

Это код, лежащий в основе:

 namespace MyNamespace {
   public partial class MyPage {
      private readonly MyModel _viewModel;
      
      public NewsDetailPage() {
         InitializeComponent();
         BindingContext = _viewModel = new MyModel();
      }

      protected override void OnAppearing() {
         base.OnAppearing();
         _viewModel.OnAppearing();
      }
   }
}
 

Это модель представления:

 namespace MyOtherNamespace {
   public class MyModel {
      private string _myProperty;

      public MyModel() {
         MyClass = new MyClass ();
         Load= new Command(async () => await GetFromAPI("one"));
      }

      public Command Load { get; set; }
      public MyClass MyClass { get; set; }
      
      public string MyProperty{
         get => _myProperty;
         set {
            _date= _myProperty;
            SetProperty(ref _myProperty, value);
         }
      }

      public void OnAppearing() {
         IsBusy = true;
      }


      public async Task GetFromAPI(string x) {
         // News = load from a Web API and populates the MyProperty property
      }
}
 

Наконец, класс MyType определяется как:

 public class MyClass {
   public string MyProperty { get; set; }
}
 

Я не могу понять, почему <Label Text="{Binding MyClass.MyProperty}"/> ничего не показывает, даже если я проверил, что во время отладки свойство gest правильно заполняется изнутри GetFromAPI() метода модели представления.

Комментарии:

1. ваше MyClass свойство имеет тип News , а не тип MyClass . Есть ли News свойство с именем MyProperty ?

2. Извините, я исправил.

3. Пожалуйста, найдите время, чтобы точно опубликовать свой код. Очень неприятно тратить время на попытки помочь, когда каждая проблема, которую я нахожу, это просто «опечатка», которую вы допустили при публикации своего кода. Как уже сообщалось, ваше свойство MyString не содержит никакого значения, поэтому, конечно, оно ничего не отобразит в вашем пользовательском интерфейсе.

4. вы можете легко проверить это, установив значение по умолчанию public string MyProperty { get; set; } = "test";

Ответ №1:

Реализуйте INotifyPropertyChanged интерфейс в MyClass , и он работает на моей стороне:

 public class MyModel
{
    public MyModel()
    {
        MyClass = new MyClass();
        MyClass.MyProperty = "abc";

        Load = new Command(async () => await GetFromAPI("one"));            
    }

    public Command Load { get; set; }
    public MyClass MyClass { get; set; }

    public bool IsBusy { get; private set; }

    public void OnAppearing()
    {
        IsBusy = true;
    }

    public async Task GetFromAPI(string x)
    {
        // News = load from a Web API and populates the MyProperty property

        MyClass.MyProperty = "efg";
    }
}

public class MyClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string myProperty { get; set; }

    public string MyProperty
    {
        set
        {
            if (myProperty != value)
            {
                myProperty = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("MyProperty"));
                }
            }
        }
        get
        {
            return myProperty;
        }
    }
}