我在设置DVC后设置它时,尝试在UI中更新StringElement的'Value'。
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。
为什么它不是属性,在setter中有逻辑来更新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
中创建的单元格进行类范围引用,而不是函数作用域。然后将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
实例创建多个“实时”*单元格?
*我说实时指示单元格当前是活动UI的一部分。当我从子对话框导航回对话框时,我注意到再次调用了GetCell方法,并且基于Element创建了一个新的单元格,但这仍然是元素和活动单元格之间的1-1。
答案 0 :(得分:1)
主要问题:
为什么MonoTouch.Dialog会为某些Element选项使用公共字段,为其他选项使用公共属性?
我已经完成了代码,我认为没有一致的理由可以使用。
Dialog项目最初并不是MonoTouch项目的一部分 - 我不认为Miguel知道当他开始编写并发展它时会变得多么有用 - 我认为他更专注于编写像TweetStation这样的其他应用程序当时。
我知道有几个人(包括我!)已经对代码进行了分支并根据其目的进行了调整。我想在未来的某个方面,Xamarin可能会编写一个更严格的编码标准的2.0版本。
参考活细胞
对于限制使用,您可以执行此操作...但通常 不 。
表视图的想法是当用户向上和向下滚动时单元格被重用 - 特别是为了节省内存和ui资源。由于这是一个很长的列表,多个元素可能会引用同一个单元格。
如果你想要缓存一个单元格引用,那么你可能应该覆盖GetCell(),以便它永远不会尝试重用现有的单元格(从不调用DequeueReusableCell)
或者,你可以尝试更改基本Element类中的一些代码,以便找出Element是否有一个当前附加的单元格 - 这就是CurrentAttachedCell在我的Dialog https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Dialog/Dialog/Elements/Element.cs分支中所做的事情(但是那个分支)有其他添加的功能和依赖项,所以你可能不想将它用于当前的工作!)