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

本文关键字:选项 元素 其他 属性 字段 MonoTouch 为什么 Dialog | 更新日期: 2023-09-27 18:31:10

我正在尝试在设置DVC后设置StringElement的"值"时在UI中更新。

例如:

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实例创建多个"活动"*单元?

*我说实时以指示当前属于活动 UI 的单元格。我确实注意到,从子对话框导航回对话框时,会再次调用 GetCell 方法,并基于 Element 创建一个新单元格,但这仍然是元素和活动单元格之间的 1-1。

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

对于主要问题:

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

我已经浏览了代码,我认为使用它们都没有一致的理由。

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

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

参考活细胞

对于有限的使用,您可以这样做...但一般来说不会

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

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

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