2011-02-18 72 views
2

我想使用单击对话框作为不可编辑的数据显示某些数值。但是调用DialogViewController.ReloadData不会更新绑定对象的数据。Monotouch-Dialog ReloadData不重新加载数据?


class AccountFormModel 
{ 
     [Section("Account data", "")] 

     [Caption("Balance")] 
     public string balance; 
} 
... 
private void InitComponents() 
{ 
      accountFormModel = new AccountFormModel(); 
      accountFormModel.balance = "TestTestTest"; 
      bc = new BindingContext(this, accountFormModel, "AccountData"); 
      dialogViewController = new DialogViewController(bc.Root); 
      dialogViewController.Autorotate = true; 
} 

private void RefreshData() 
{ 
      string b = SomeDatasource.Account.Balance.ToString("N4"); 
      accountFormModel.balance = "$" + b; 
      dialogViewController.ReloadData(); 
} 

调试表明accountFormModel.balance在refreshData方法被设置为正确的值,但没有在模拟器上的形式变化(保持TestTestTest)。我做错了什么?

回答

3

DialogViewController在使用反射时最初会执行一次绑定,并且只有当您的FetchData()是将数据传回给您的类时。

会发生什么情况是,BindingContext基本上会根据您的数据(此例中为balance)创建模型,从而有效地制作此时的数据副本。当你调用ReloadData()时,这是从副本重新加载数据,这就是为什么你没有看到变化。尽管可以改变这种方式来在BindingContex上重新填充数据,但目前情况并非如此。

MonoTouch.Dialog的Reflection API非常有限,我强烈建议您,对于任何非平凡的东西,您都使用Elements API。 MonoTouch.Dialog中的大部分示例都使用该API,因为它使您可以完全控制对话框。

+0

嘿米格尔,所以如果我有一个大对象的列表(大约1000),我试图建立一个大的可滚动列表,或许Dialog不是最适合的工具?我广泛使用SyleStringElement,即使在Root.Add(mySection)调用完成后,它也需要大约3-4秒才能呈现UITableView(在3GS设备上)。我可以很轻松地重写GetCell来完成同样的事情,而不使用Dialog。如果我将它理解为意味着Dialog不适合使用Elements API呈现大型列表,我是否正确理解了您的答案? – NovaJoe 2011-04-11 15:36:42