为什么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分支中做的事(但该分支具有其他附加功能和依赖项,因此您可能不希望为此使用它目前的工作!)