当我在设置 DVC 后设置它时,我试图在 UI 中更新 StringElement 的“值”。
例如:
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
(基本上只是从这里逐字复制源代码)
然后我将其更改为对在中创建的单元格进行类范围引用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
实例创建多个“活动”* 单元?
*我说 live 表示当前是活动 UI 的一部分的单元格。从子对话框导航回对话框时,我确实注意到再次调用 GetCell 方法并基于元素创建一个新单元格,但这仍然是元素和活动单元格之间的 1-1。