2

当我在设置 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。

4

1 回答 1

1

对于主要问题:

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

我已经阅读了代码,但我认为使用其中任何一个都没有一致的理由。

Dialog 项目最初不是 MonoTouch 项目的一部分——我认为 Miguel 在开始编写和发展它时并不知道它会有多大用处——我认为他当时更专注于编写其他应用程序,例如 TweetStation .

我知道有几个人(包括我!)已经对代码进行了分支并针对他们的目的进行了调整。我猜想在未来某个时间点,Xamarin 可能会编写一个具有更严格编码标准的 2.0 版本。

参考活细胞

对于有限的使用,你可以这样做......但一般不要

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

如果您确实想缓存单元格引用,那么您可能应该覆盖 GetCell() 以便它永远不会尝试重用现有单元格(永远不会调用 DequeueReusableCell)

或者,您可以尝试更改基本 Element 类中的一些代码,以查明 Element 是否具有当前附加的单元格 - 这就是 CurrentAttachedCell 在我的 Dialog 分支https://github.com/slodge/MvvmCross/中所做的事情blob/master/Sirrious/Cirrious.MvvmCross.Dialog/Dialog/Elements/Element.cs(但该分支具有其他附加功能和依赖项,因此您可能不想将其用于当前工作!)

于 2012-04-14T11:54:41.190 回答