これを正しい方法で行っているかどうか疑問に思っています-この方法は機能しますが、やや「汚い」と感じます。基本的に、 のボタン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
それが単なるオブジェクトであるとき、どうすればそれを行うことができますか?
スチュアートがこれを手伝ってくれることを本当に望んでいます;)