#xamarin #properties
Вопрос:
Я столкнулся с проблемой при создании проекта. Если я использую свойства (get;set;), приложение Android завершает работу в момент присвоения значения свойству.
Например: я создал чистый проект xamarin, чтобы устранить влияние моего кода.
Собственность в моем классе:
public class Item
{
public string Id
{
get { return Id; }
set { Id = value; }
}
}
Использование имущества:
public AboutPage()
{
Item gg = new Item();
gg.Id = "test";
InitializeComponent();
}
Приложение выходит из строя на линии:
set { Id = value; }
Ошибка не отображается.
Ошибка
Справка. Это первый раз, когда я это вижу. Я понизил рейтинг платформы. Использованные чистые проекты. Что я делаю не так?
UPD: ссылка на мое решение
Комментарии:
1. Привет @Adventure, не хотели бы вы поделиться версиями Xamarin, которые вы используете?
2. Я использую формы Xamarin версии 5.0.0.2012. Версии являются последними, и проект в студии чист.
Ответ №1:
Вы можете попробовать изменить свойство, как показано ниже:
public class Item
{
public string Id { get; set; }
}
или
public class Item
{
private string id;
public string Id
{
get { return id; }
set { id = value; }
}
}
когда вы нарушаете INotifyPropertyChanged
интерфейс:
public class Item : INotifyPropertyChanged
{
private string id;
public string Id
{
get { return id; }
set { id = value; OnPropertyChanged("Id"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Комментарии:
1. Вот как это работает. Но это не вариант. Я столкнулся с этой проблемой, когда внедрял интерфейс INotifyPropertyChanged.
2. @AdventureMania Вы могли бы проверить выше.
3. Спасибо. Я разрешил ссылку по имени свойства. Это моя ошибка. Извините.
Ответ №2:
Когда вы это сделаете:
public string Id
{
get { return Id; }
set { Id = value; }
}
Вы, по сути, создаете бесконечный цикл. Вот почему ваше приложение выходит из строя. Вы бесконечно вызываете сеттера.
Вместо этого вы либо сделаете его свойством auto:
public string Id { get; set; }
или добавьте резервное поле для свойства:
private string _id;
public string Id
{
get => _id;
set => _id = value;
}