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

C# 为什么MonoTouch.Dialog对某些元素选项使用公共字段,而对其他元素选项使用公共属性,c#,xamarin.ios,monotouch.dialog,C#,Xamarin.ios,Monotouch.dialog,当我在设置DVC之后设置StringElement时,我试图在UI中更新它的“值” e、 g: 但是,StringElement.Value只是一个公共字段,仅在初始化期间调用Element.GetCell时写入UICell 为什么它不是一个属性,在setter中使用逻辑来更新UICell(像大多数元素一样,例如EntryElement.Value): 编辑: 我制作了自己版本的StringElement,源于Element(基本上只是逐字复制) 然后我将其更改为对在GetCell中创建的单元格

当我在设置DVC之后设置StringElement时,我试图在UI中更新它的“值”

e、 g:

但是,StringElement.Value只是一个公共字段,仅在初始化期间调用Element.GetCell时写入UICell

为什么它不是一个属性,在setter中使用逻辑来更新UICell(像大多数元素一样,例如EntryElement.Value):

编辑:
我制作了自己版本的
StringElement
,源于
Element
(基本上只是逐字复制)

然后我将其更改为对在
GetCell
中创建的单元格进行类范围的引用,而不是函数范围的引用。然后将
字段更改为属性:

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'*单元

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

对于主要问题:

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

我已经看过了代码,我认为使用这两种方法都没有一致的理由

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

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

参考活细胞

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

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

如果确实要缓存单元格引用,则可能应该重写GetCell(),使其永远不会尝试重用现有单元格(永远不会调用DequeueReusableCell)

或者,您可以尝试更改基本元素类中的一些代码,以确定元素是否具有当前附加的单元格-这是CurrentAttachedCell在我的对话框分支中所做的操作(但该分支具有其他添加的函数和依赖项,因此您可能不希望将其用于当前工作!)

public string Value 
{
    get { return val; }
    set 
    {
        val = value;
        if (entry != null)
            entry.Text = 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;
        }
    }
}