Xamarin.ios 如何通过MVVMcross中的绑定将viewmodel中的更改反映到tableviewcell视图

Xamarin.ios 如何通过MVVMcross中的绑定将viewmodel中的更改反映到tableviewcell视图,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,在MvxBindableTableViewCell中使用时,我有点难以将视图模型中的更改反映到视图中。我正在iOS上使用MvvmCross的vNext分支 所有设置均正确,首次加载/显示列表时,初始值可见。该列表是一个可观察集合,ViewModels继承自MvxViewModel(因此实现了INotifyPropertyChanged) 主视图模型如下所示: public abstract class BaseViewModel : MvxViewModel, IMvxServiceConsum

MvxBindableTableViewCell
中使用时,我有点难以将视图模型中的更改反映到视图中。我正在iOS上使用MvvmCross的vNext分支

所有设置均正确,首次加载/显示列表时,初始值可见。该列表是一个
可观察集合
,ViewModels继承自
MvxViewModel
(因此实现了INotifyPropertyChanged)

主视图模型如下所示:

public abstract class BaseViewModel : MvxViewModel, IMvxServiceConsumer
{
    //... just regular implementation
}

public class UploadListViewModel: BaseViewModel
{
    private readonly IUploadItemTasks uploadItemTasks;
    private readonly IPhotoPickerService photoPickerService;

    public IObservableCollection<UploadItemViewModel> Uploads { get { return this.LoadUploadItems(); }  }

    public UploadListViewModel()
    {
        this.uploadItemTasks = this.GetService<IUploadItemTasks>();
        this.photoPickerService = this.GetService<IPhotoPickerService>();
    }

    private IObservableCollection<UploadItemViewModel> LoadUploadItems()
    {
        using (var unitOfWork = UnitOfWork.Start ())
        {
            return new SimpleObservableCollection<UploadItemViewModel>(uploadItemTasks.GetAll());
        }
    }

    public void StartUpload ()
    {
        if (this.Uploads == null || this.Uploads.Count == 0) {
            ReportError("Error", "No images to upload");
            return;
        }

        this.Uploads.ForEach (uploadItem => PostCallback (uploadItem));
    }

    private void PostCallback (UploadItemViewModel uploadAsset)
    {
        IProgressReporter progressReporter = uploadAsset;

        this.photoPickerService.GetAssetFullImage(uploadAsset.ImageUrl,
                                                  (image) => {
            UIImage fullImage = image;
            NSData jpeg = fullImage.AsJPEG();

            byte[] jpegBytes = new byte[jpeg.Length];           
            System.Runtime.InteropServices.Marshal.Copy(jpeg.Bytes, jpegBytes, 0, Convert.ToInt32(jpeg.Length));

            MemoryStream stream = new MemoryStream(jpegBytes);
            Uri destinationUrl = new Uri(uploadAsset.DestinationUrl + "&name=" + uploadAsset.Name + "&contentType=image%2FJPEG");

            //TO DO: Move this to plugin
            var uploader = new Uploader().UploadPicture (destinationUrl, stream, UploadComplete, progressReporter);
            uploader.Host = uploadAsset.Host;

            ThreadPool.QueueUserWorkItem (delegate {
                uploader.Upload ();                 
                jpeg = null;
            });
        });
    }

    private void UploadComplete (string name)
    {
        if (name == null){
            ReportError("Error","There was an error uploading the media.");
        } else 
        {
            //ReportError("Succes", name);
        }
    }

项目的视图继承自
MvxBindableTableViewCell
,并具有以下属性:

private float progress;
public float ProgressMarker {
    get {
        return progress;
    }
    set {
        progress = value;
        // change progressbar or textfield here
    }
}
tableviewcell通过BindingText绑定到
UploadItemViewModel

public const string BindingText = @"ProgressMarker Progress, Converter=Float;";
UploadListViewModel
片段中提到的
Uploader
类实现了一个私有方法,该方法尝试在IProgressReporter上设置进度

    float progressValue;
    void SetProgress (float newvalue)
    {
        progressValue = newvalue;

        this.dispatcher.InvokeOnMainThread (delegate {
            if (ProgressReporter != null)
                ProgressReporter.Progress = progressValue;
        });
    }
在第一次查看列表期间,我可以看到ViewModel和View中的属性都被点击,但当我通过界面
IProgressReporter
Progress
中使用新值更新ViewModel时,tableviewcell中的视图不会被更新,也不会调用该属性

我做错了什么?我错过了什么


更新:检查此问题的答案。

我找到了绑定不起作用的原因。我一次又一次地替换可观察到的集合。。我如下面所述更改了这段代码,现在它反映了在单元格视图中对UploadItemViewModel所做的更改

    private IObservableCollection<UploadItemViewModel> uploads;
    private IObservableCollection<UploadItemViewModel> LoadUploadItems()
    {
        if (uploads == null)
        {
            using (var unitOfWork = UnitOfWork.Start ())
            {
                uploads = new SimpleObservableCollection<UploadItemViewModel>(uploadItemTasks.FindAll());
            }
        }
        return uploads;
    }
private IObservableCollection上传;
私有IObservableCollection LoadUploadItems()
{
if(上传==null)
{
使用(var unitOfWork=unitOfWork.Start())
{
uploads=新的SimpleObservableCollection(uploadItemTasks.FindAll());
}
}
返回上传;
}

我找到了绑定不起作用的原因。我一次又一次地替换可观察到的集合。。我如下面所述更改了这段代码,现在它反映了在单元格视图中对UploadItemViewModel所做的更改

    private IObservableCollection<UploadItemViewModel> uploads;
    private IObservableCollection<UploadItemViewModel> LoadUploadItems()
    {
        if (uploads == null)
        {
            using (var unitOfWork = UnitOfWork.Start ())
            {
                uploads = new SimpleObservableCollection<UploadItemViewModel>(uploadItemTasks.FindAll());
            }
        }
        return uploads;
    }
private IObservableCollection上传;
私有IObservableCollection LoadUploadItems()
{
if(上传==null)
{
使用(var unitOfWork=unitOfWork.Start())
{
uploads=新的SimpleObservableCollection(uploadItemTasks.FindAll());
}
}
返回上传;
}

您还可以发布更多的代码吗?可能是一个要点,包括列表中项目的类别以及包含该列表的ViewModel部分。另外,这里的
Mode=TwoWay
位也让我感到困惑——只是检查一下我没有误解你的问题。我用更多的代码更新了我的问题。希望现在更清楚了。
Mode=TwoWay
第一部分被删除,因为这是一些测试的残余。它应该是单向的;从视图模型到视图。谢谢-我看不出任何错误。我明天要试着得到一份复职(但时间紧迫)我能问一件事吗?您可以检查单元格的ProgressMarker
set
是否未被调用吗?e、 g.添加一些跟踪。我唯一能想到的是,
SetNeedsDisplay()
不足以导致重画(这通常适用于自定义的
Draw
方法?),我在ProgressMarker的
集合
中放置了一个跟踪,它显示只有在初始查看时才会调用它。我还在
UploadItemViewModel
中的
进度集
中添加了一个跟踪,它得到了很好的更新,但视图没有得到更新。属性更改的传播似乎未完成,或者绑定不同步?确实,
SetNeedsDisplay()
只对自定义绘图进行重画是必需的,所以我删除了它。还有更多的代码可以发布吗?可能是一个要点,包括列表中项目的类别以及包含该列表的ViewModel部分。另外,这里的
Mode=TwoWay
位也让我感到困惑——只是检查一下我没有误解你的问题。我用更多的代码更新了我的问题。希望现在更清楚了。
Mode=TwoWay
第一部分被删除,因为这是一些测试的残余。它应该是单向的;从视图模型到视图。谢谢-我看不出任何错误。我明天要试着得到一份复职(但时间紧迫)我能问一件事吗?您可以检查单元格的ProgressMarker
set
是否未被调用吗?e、 g.添加一些跟踪。我唯一能想到的是,
SetNeedsDisplay()
不足以导致重画(这通常适用于自定义的
Draw
方法?),我在ProgressMarker的
集合
中放置了一个跟踪,它显示只有在初始查看时才会调用它。我还在
UploadItemViewModel
中的
进度集
中添加了一个跟踪,它得到了很好的更新,但视图没有得到更新。属性更改的传播似乎未完成,或者绑定不同步?确实,
SetNeedsDisplay()
只在自定义绘图时才需要,所以我删除了它。谢谢@Remco的自动回复!我昨天建立了一个v3案例-它成功了。。。所以我今天打算试试v2。。。但现在我不需要:)谢谢@Remco的自我回答!我昨天建立了一个v3案例-它成功了。。。所以我今天打算试试v2。。。但现在我不需要:)