2011-12-13 2 views
2

Использование MonoTouch.Dialog Я добавляю StyledStringElement элементов.MonoTouch.Dialog: обновление текста в элементе

Существует фоновая задача, которая извлекает данные, которые нужно обновить element.Value

Есть ли способ, чтобы заставить элемент, чтобы иметь это текст обновляется после element.Value обновляется?

Ян

ответ

12

Если вы хотите обновить этот элемент-поэлементным, то вы можете использовать что-то вроде:

public class MyStyledStringElement { 

    public void SetValueAndUpdate (string value) 
    { 
     Value = value; 
     if (GetContainerTableView() != null) { 
      var root = GetImmediateRootElement(); 
      root.Reload (this, UITableViewRowAnimation.Fade); 
     } 
    } 
} 

Варианта будет загружать все и обновлять один раз (то есть итерация на root.Reload за каждые Element).

+0

Как бы вы программно перебирали элементы? – BRogers

+0

Это не работает для меня, значение Caption не обновляется. У меня аналогичная проблема с очень конкретным случаем. Когда я добавил элементы, и после того, как я изменил свойство caption, это не обновление метки «caption». Почему ?, потому что элемент находится только в нижней части экрана и не является полностью невидимым для контроллера. Итак, если я просматриваю табличное представление, чтобы сделать видимым элемент границы, подпись не обновляется. Мне нужно снять табличное представление, чтобы элемент границы не был виден полностью, чтобы принудительно обновить. – rolivares

+0

Трудно сказать, не видя кода (вы должны создать вопрос и предоставить больше данных). Тот факт, что * * правильно * при выключенном экране является то, что ячейки кэшируются (iOS), поэтому в какой-то момент они будут повторно использованы (для чего-то еще), и когда вы вернетесь к ним, это уже не та самая ячейка (она была воссоздана с помощью последние значения). Это совершенно нормально. – poupou

1

Я добавил «this.PrepareCell (cell), в метод SetValueAndUpdate и работает. Но я все еще думаю, что есть еще одна лучшая опция, определяющая изменение« caption »и вызов this.PrepareCell (cell); .

public void UpdateCaption(string caption) { 
     this.Caption = caption; 
     Console.WriteLine ("actualizando : " + Caption); 
     UITableViewCell cell = this.GetActiveCell(); 
     if (cell != null) { 
      this.PrepareCell (cell); 
      cell.SetNeedsLayout(); 
     } 
} 
0

Другой подход, чтобы обновить ярлык будет извлечь из StyledStringElement или StringElement и непосредственно обновить DetailTextLabel в клетке:

class UpdateableStringElement : StringElement 
{ 
    public UpdateableStringElement(string name): base (name) 
    { 
    } 

    UILabel DetailText = null; 

    public void UpdateValue(string text) 
    { 
     Value = text; 
     if (DetailText != null) 
      DetailText.Text = text; 
    } 

    public override UITableViewCell GetCell(UITableView tv) 
    { 
     var cell = base.GetCell(tv); 
     DetailText = cell.DetailTextLabel; 
     return cell; 
    } 
} 

Вместо того, чтобы Value собственности вы с затем используйте метод UpdateValue:

var element = new UpdateableStringElement("demo"); 

SomeEventOfYours += delegate { 
    element.UpdateValue(LocalizedValue); 
}; 
Смежные вопросы