2016-11-08 1 views
0

У меня есть страница содержания «AnimalPage» с ярлыками. Я хочу привязать label.Text к свойствам класса, чтобы метки автоматически обновлялись по мере изменения значений свойств.Как привязать ярлык к свойству в Xamarin?

Класс «Animal», который имеет два свойства, обхват & длина. При изменении значения третье свойство «вес» рассчитывается автоматически (примечание: код, который запускает расчет, не показан ниже). Когда изменяется свойство , я хочу автоматически обновить ярлык на странице содержимого.

Многие из примеров, которые я нашел на Xamarin, - это XAML, которые я не использую.

В настоящий момент, когда страница загружается, на ярлыке Weight отображается начальное значение, поэтому похоже, что привязка верна, но когда свойство веса изменяется, метка не обновляется.

Я установил контрольные точки в коде и вызывается метод calcWeight и свойство веса изменяется, но weightCell.cellText не изменяется.

Что мне не хватает?

public class Animal { 
    public string Name { get; set; } 

    private double _girth; 
    // when girth changes, save the value and trigger a re-calculation of weight 
    public double girth { get { return _girth; } set { _girth = value; this.calcWeight(); } } 
    private double _length; 

    // same for length changes; save the value and trigger a re-calculation of weight 
    public double length { get { return _length; } set { _length = value; this.calcWeight(); } } 

    private double _weight; 
    public double weight { get { return _weight; } set { _weight = value; } } 

    public Animal() 
    { 
     ... 
    } 
    ... 
    public double calcWeight() 
    { 
     // formula for weight calculation goes here... 
     ... 
     this.weight = weight; 
     return weight; 

    } 
} 

страница, которая отображает этот класс выглядит следующим образом:

internal class AnimalPage : ContentPage 
{ 
    private Animal animal { get; set; } 

    public AnimalPage(Animal animal) 
    { 
     this.animal = animal; 
     BindingContext = this.animal; 
     var weightCell = new ResultCell(); // ResultCell is a custom ViewCell 
     Binding myBinding = new Binding("weight"); 
     myBinding.Source = this.animal; 
     weightCell.cellText.SetBinding(Label.TextProperty, myBinding); 
     ... 
    } 
} 

Для полноты картины, вот это класс ResultCell который просто обычай ViewCell с двумя метками отображается горизонтально.

public class ResultCell : ViewCell { 
    public Label cellLabel, cellText; 

    public ResultCell() { 
     cellLabel = new Label(); 
     cellText = new Label(); 

     var cellWrapper = new StackLayout { 
      ... 
      Children = { cellLabel, cellText } 
     }; 
     View = cellWrapper; 
    } 
} 

ответ

0

Если вы хотите, чтобы ваш пользовательский интерфейс для автоматического обновления, когда ваши данные изменения, ваш класс животных необходимо реализовать INotifyPropertyChanged, и вы должны стрелять событие PropertyChanged всякий раз, когда ваше имущество вес изменяется или пересчитывается. Это событие предупреждает пользовательский интерфейс, который необходимо обновить.

+0

Да, это сработало. Я пошел на примере здесь: https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx Это имеет смысл, но я видел примеры Xamarin, где они не наследуются от INotifyPropertyChanged и все еще работают, поэтому я очень смущен. Единственное, о чем я могу думать, это то, что они, должно быть, унаследовали от класса Xamarin, который уже реализовал это. – IamJohnny45

0

Поскольку это заняло у меня столько времени, чтобы понять, что я решил опубликовать исправленный класс Animal, если это поможет кому-то другому.

public class Animal : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Name { get; set; } 

    private double _girth; 
    public double girth { get { return _girth; } set { _girth = value; this.calcWeight(); } } 

    private double _length; 
    public double length { get { return _length; } set { _length = value; this.calcWeight(); } } 

    private double _weight; 
    public double weight { get { return _weight; } set { _weight = value; NotifyPropertyChanged(); } } 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

public Animal() 
{ 
    ... 
} 
... 
public double calcWeight() 
{ 
    // formula for weight calculation goes here... 
    ... 
    this.weight = weight; 
    return weight; 

} 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^