我对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在这里没有正确设置?
谢谢!
答案 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];
}
}
}
希望这有帮助!我认为主要问题是你试图将视图模型直接发送到不存在的单元格中。如果这是你需要完成的事情,你需要在你的集合对象周围创建一些包装器,它在你需要访问的视图模型中发送。