为什么MonoTouch.Dialog对某些元素选项使用公共属性,对其他元素使用公共属性

问题描述:

我试图在设置完DVC后设置它时,在UI中更新StringElement的'Value'来更新。为什么MonoTouch.Dialog对某些元素选项使用公共属性,对其他元素使用公共属性

e.g:

public partial class TestDialog : DialogViewController 
{ 
    public TestDialog() : base (UITableViewStyle.Grouped, null) 
    { 
     var stringElement = new StringElement("Hola"); 
     stringElement.Value = "0 Taps"; 
     int tapCount = 0; 
     stringElement.Tapped +=() => stringElement.Value = ++tapCount + " Taps"; 

     Root = new RootElement("TestDialog") 
     { 
      new Section("First Section") 
      { 
       stringElement, 
      }, 
     }; 
    } 
} 

然而StringElement.Value仅仅是一个公共领域,当Element.GetCell称为初始化过程中只写入UICell。

为什么不是一个属性,与逻辑在二传手更新UICell(像大多数元素,例如EntryElement.Value):

public string Value 
{ 
    get { return val; } 
    set 
    { 
     val = value; 
     if (entry != null) 
      entry.Text = value; 
    } 
} 

编辑:
我做了我自己的版本的StringElement,从Element导出(基本照搬了source code from here逐字)

然后我把它改为采取类范围的参考GetCell创建的,而不是功能SCOP细胞编辑。然后改变了Value字段属性:

public string Value 
{ 
    get { return val; } 
    set 
    { 
     val = value; 
     if (cell != null) 
     { 
      // (The below is copied direct from GetCell) 

      // The check is needed because the cell might have been recycled. 
      if (cell.DetailTextLabel != null) 
       cell.DetailTextLabel.Text = Value == null ? "" : Value; 
     } 
    } 
} 

它工作在最初的测试。然而,我不确定是否允许引用单元格,其他元素似乎都没有这样做(它们仅引用控件放置在单元格中的引用)。是否有可能基于一个MonoTouch.Dialog.Element实例创建多个'live'*单元?

*我说现场指示单元目前是活动用户界面的一部分。从一个子对话框导航回到对话框时,我注意到GetCell方法再次被调用,并且基于元素创建了一个新的单元,但这仍然是元素和活动单元之间的一个1-1。

对于主要问题:

为什么MonoTouch.Dialog使用一些元素的选项为他人公共领域和公共属性?

我已经通过了代码,我不认为有任何一致的理由使用。

对话框项目最初并不是MonoTouch项目的一部分 - 我不认为Miguel知道当他开始写作和发展它时它会变得多么有用 - 我认为他更专注于编写其他应用程序当时的TweetStation。

我知道有几个人(包括我!)谁已经分支了代码并将其用于他们的目的。我猜想在未来某个时候,Xamarin可能会编写一个更严格的编码标准的2.0版本。

以引用的活细胞

有限使用,你可以做到这一点......但总的来说

表视图的想法是,当用户上下滚动时单元格会被重用 - 特别是为了节省内存和ui资源。由于这是一个很长的列表,因此多个元素可能会引用同一个单元格。

如果你想缓存单元格引用,那么你可能应该重写GetCell(),所以它永远不会尝试重新使用现有的细胞(永远不会调用DequeueReusableCell)

或者,你可以尝试更改一些代码base元素类,以查明元素是否具有当前连接的单元格 - 这是CurrentAttachedCell在Dialog https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Dialog/Dialog/Elements/Element.cs分支中做的事(但该分支具有其他附加功能和依赖项,因此您可能不希望为此使用它目前的工作!)