MvvmCross - TableViewCell中的延迟绑定与值转换器 - DataContext未正确设置?

时间:2015-02-05 14:46:28

标签: ios mvvm xamarin mvvmcross

我对Mvvm和MvvmCross相对较新。我在iOS中遇到了问题;

这是我对MvxTableViewCell子类的延迟绑定,我已将其放入AwakeFromNib

this.DelayBind(() =>
{
    var bindingSet = this.CreateBindingSet<MyTableViewCell, MyViewModel>();
    bindingSet.Bind(myLabel).To(vm => vm.Name).WithConversion(debugvalueconverter, base.DataContext);
});

我的debugvalueconverter看起来像这样:

public class DebugValueConverter : IMvxValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                System.Diagnostics.Debug.WriteLine("Converting debug: " + value);
                if (parameter != null)
                {
                    var vm = (MyViewModel)parameter;
                    System.Diagnostics.Debug.WriteLine("Converting debug - name from vm: " + vm.Name);
                }
                return value;
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return new NotImplementedException();
            }
        }

当我在桌面视图中拖动时开始回收单元格时,这会生成一些奇数输出:

Converting debug: [Name from the cell that's appearing]  
Converting debug - name from vm: [Name from an old cell which got recycled]

即。在这种情况下似乎没有正确设置DataContext,但是name-property设置正确。为什么会这样?

我的问题是我想使用一个转换器,根据我的ViewModel(即我的base.DataContext)的一些属性中的内容进行一些“高级”计算。

这是MvvmCross中的错误还是我错过了什么?为什么DataContext在这里没有正确设置?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不认为你可以将视图模型发送到单元格。您需要在视图中执行绑定,并将视图中的单元格绑定到视图模型中的对象集合。通常我做这样的事情:

public partial class MainView : MvxViewController
{

    /// <summary>
    /// Views the did load.
    /// </summary>
    /// <summary>
    /// Called when the View is first loaded
    /// </summary>
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var source = new MvxSimpleTableViewSource(MainTableView, MainInspectionCell.Key, MainInspectionCell.Key);
        MainTableView.Source = source;

        var set = this.CreateBindingSet<MainView, MainViewModel>();

        set.Bind(source).To(vm => vm.Inspections);
        set.Bind(source).For(s => s.SelectionChangedCommand).To(vm => vm.ItemSelectedCommand);

        set.Apply();

        MainTableView.ReloadData();
}

然后对于单元格,我通常在单元格的构造函数中进行绑定,如下所示:

public partial class MainInspectionCell : MvxTableViewCell
{
    public static readonly UINib Nib = UINib.FromName("MainInspectionCell", NSBundle.MainBundle);
    public static readonly NSString Key = new NSString("MainInspectionCell");

    public MainInspectionCell(IntPtr handle) : base (handle)
    {
        this.DelayBind(() =>
        {
            var set = this.CreateBindingSet<MainInspectionCell, Inspection>();
            set.Bind(InspectionCell).For(v => v.BackgroundColor).To(vm => vm.StatusColor).WithConversion("NativeColor");
            set.Apply();
        });
    }

    public static MainInspectionCell Create()
    {
        return (MainInspectionCell)Nib.Instantiate(null, null)[0];
    }
}

}

希望这有帮助!我认为主要问题是你试图将视图模型直接发送到不存在的单元格中。如果这是你需要完成的事情,你需要在你的集合对象周围创建一些包装器,它在你需要访问的视图模型中发送。