为什么MonoTouch.Dialog将公共字段用于某些Element选项,将公共属性用于其他元素选项

时间:2012-04-14 08:02:50

标签: c# xamarin.ios monotouch.dialog

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

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分支中所做的事情(但是那个分支)有其他添加的功能和依赖项,所以你可能不想将它用于当前的工作!)