MVVMCross更新绑定到UITableViewCell

时间:2013-08-06 22:34:49

标签: xamarin.ios xamarin mvvmcross

我想知道我是否以正确的方式这样做 - 这种方法有效,但感觉有点“脏”。本质上,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的命令,后者又通过{{绑定回单元格的背景颜色1}}值转换器。

我遇到的问题是,单元格不会立即更新 - 只有当我滚动出该单元格的视图并返回视图时(即重新绘制单元格)。所以我认为我只是让细胞变得“脏”:

ButtonConverter

但这不起作用。 的工作原理是在 this.SelectButton.TouchUpInside += (o, e) => { this.SetNeedsDisplay(); }; 事件中添加其他代码,以手动更改背景颜色。但我认为这不是正确的方式。

当我更改TouchUpInside对象中RaisePropertyChanged的值时,是否需要触发Selected?当它只是一个物体时,我怎么能这样做呢?

真希望斯图尔特可以帮忙解决这个问题;)

1 个答案:

答案 0 :(得分:6)

我认为您的分析是正确的 - 因为您的Expense对象没有更改消息,所以UI不会实时更新。

要在视图模型对象中提供“传统”更改通知,您需要确保每个更改通知都支持INotifyPropertyChanged。如果您愿意,这个小界面很容易实现 - 或者如果您愿意,您可以修改您的Expense以继承内置的MvxNotifyPropertyChanged帮助程序类 - 然后可以使用RaisePropertyChanged。

作为另一种选择,如果您愿意,还可以实现新的“Rio”字段绑定。有关此内容的介绍,请参阅http://mvvmcross.blogspot.com

中的N = 36