3

これを正しい方法で行っているかどうか疑問に思っています-この方法は機能しますが、やや「汚い」と感じます。基本的に、 のボタンMvxTableViewCellはバインドされたオブジェクトのパラメータを変更しますが、セルは、スクロールしてビューから出てビューに戻るまで (つまり、セルが「再描画」されるまで)、変更を反映して更新されません。ここにあるすべての例は簡略化されていますが、アイデアは理解できます..

まず、私のオブジェクト:

public class Expense
{
    public decimal Amount { get; set; }
    public bool Selected { get; set; }
    public Command FlipSelected
    {
        get { return new MvxCommand(()=> this.Selected = !this.Selected); }
    }
}

次に、私のセル (コンストラクター内) には以下が含まれます。

this.DelayBind(() =>
{
    var set = this.CreateBindingSet<HistoryCell, Expense>();
    set.Bind(this.TitleText).To(x => x.Amount);
    set.Bind(this.SelectButton).To(x=> x.FlipSelected);
    set.Bind(this.SelectButton).For(x => x.BackgroundColor).To(x => x.Selected).WithConversion(new ButtonConverter(), null);
    set.Apply();
});

そして、ボタンの背景色を返す valueconverter があります。

class ButtonConverter : MvxValueConverter<bool, UIColor>
{
    UIColor selectedColour = UIColor.FromRGB(128, 128, 128);
    UIColor unSelectedColour = UIColor.GroupTableViewBackgroundColor;
    protected override UIColor Convert(bool value, Type targetType, object parameter, CultureInfo culture)
    {
        return value ? selectedColour : unSelectedColour;
    }
    protected override bool ConvertBack(UIColor value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == selectedColour;
    }
}

セルのボタンをクリックすると、 bool 値を反転するコマンドが実行され、値コンバーターSelectedを介してセルの背景色にバインドされます。ButtonConverter

私が抱えている問題は、セルがすぐに更新されないことです-そのセルのビューからスクロールしてビューに戻ったときだけです(つまり、セルが再描画されます)。だから私はセルを「ダーティ」にするだけだと思った:

        this.SelectButton.TouchUpInside += (o, e) =>
        {
            this.SetNeedsDisplay();
        };

しかし、これはうまくいきません。機能するのTouchUpInside、背景色を手動で変更する追加のコードをイベント内に配置することです。しかし、これは正しい方法ではないと思います。

オブジェクトRaisePropertyChangedの値を変更したときにトリガーする必要がありSelectedますか? Expenseそれが単なるオブジェクトであるとき、どうすればそれを行うことができますか?

スチュアートがこれを手伝ってくれることを本当に望んでいます;)

4

1 に答える 1

6

あなたの分析は正しいと思います。Expense オブジェクトからの変更メッセージがないため、UI がライブで更新されていません。

ビュー モデル オブジェクトで「従来の」変更通知を提供するには、それぞれが INotifyPropertyChanged をサポートしていることを確認する必要があります。この小さなインターフェイスは、必要に応じて簡単に実装できます。または、Expense を変更して組み込みの MvxNotifyPropertyChanged ヘルパー クラスを継承することもできます。その後、RaisePropertyChanged を使用できます。

別の方法として、必要に応じて新しい「Rio」フィールド ベースのバインディングを実装することもできます。これの概要については、 http://mvvmcross.blogspot.comの N=36 を参照してください。

于 2013-08-07T01:29:13.010 に答える