#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;
}
}
}