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.Element1 つのインスタンスに基づいて複数の「ライブ」* セルが作成される可能性はありますか?

*ライブとは、セルが現在アクティブな UI の一部であることを示します。子ダイアログからダイアログに戻ると、GetCell メソッドが再度呼び出され、要素に基づいて新しいセルが作成されることに気付きましたが、要素とライブ セルの間はまだ 1-1 です。

4

1 に答える 1

1

主な質問について:

MonoTouch.Dialogが一部の要素オプションにパブリックフィールドを使用し、他のオプションにパブリックプロパティを使用するのはなぜですか?

私はコードを調べてきましたが、どちらかを使用する一貫した理由はないと思います。

Dialogプロジェクトは当初MonoTouchプロジェクトの一部ではありませんでした。ミゲルは、書き始めて成長させたときに、それがどれほど役立つかを知らなかったと思います。当時、TweetStationのような他のアプリを書くことに集中していたと思います。 。

私は、コードを分岐して目的に合わせて調整した何人かの人々(私を含む!)を知っています。将来的には、Xamarinがより厳しいコーディング標準を備えた2.0バージョンを作成する可能性があると思います。

生細胞を参照する

限定的な使用のためにこれを行うことができます...しかし、一般的にはしないでください。

テーブルビューの考え方は、ユーザーが上下にスクロールすると、特にメモリとUIリソースを節約するために、セルが再利用されることです。これは長いリストであるため、複数の要素が同じセルへの参照を取得する可能性があります。

セル参照をキャッシュする場合は、GetCell()をオーバーライドして、既存のセルを再利用しないようにする必要があります(DequeueReusableCellを呼び出さないでください)。

または、基本Elementクラスのコードを変更して、Elementに現在接続されているセルがあるかどうかを確認することもできます。これは、ダイアログのブランチhttps://github.com/slodge/MvvmCross/でCurrentAttachedCellが行うことです。 blob / master / Cirrious / Cirrious.MvvmCross.Dialog / Dialog / Elements / Element.cs(ただし、そのブランチには他の機能と依存関係が追加されているため、この現在の作業には使用したくないでしょう!)

于 2012-04-14T11:54:41.190 に答える