iOS UI 的 MVVM 交叉图片选择器插件不会在字节类型视图模型上使用 InMemoryImage 进行更新 属性

MVVM cross picture chooser plugin for iOS UI does not update using InMemoryImage on a Bytes type view model property

我正在构建一个跨平台的 Xamarin 解决方案,使用单独的 iOS / android 项目和共享 PCL 包含使用 MVVM 交叉编写的视图模型(版本 3.5.1框架和插件)。

我正在使用 iOS 设备相机拍照并将值存储在字节变量中,如下所示:

    private byte[] _bytes;

    public byte[] Bytes {
        get { return _bytes; }
        set {
            _bytes = value; 
            RaisePropertyChanged (() => Bytes); 
        }
    }

    public void TakePhoto ()
    {
            var task = Mvx.Resolve<IMvxPictureChooserTask> ();
            task.TakePicture (500, 90,
                stream => {
                    var memoryStream = new MemoryStream ();
                    stream.CopyTo (memoryStream);
                    Bytes = memoryStream.ToArray ();
                },
                () => {
                    // perform any cancelled operation
                });
    }

单击绑定按钮时相机会正确打开,并允许我拍照,但是 UI 中的图像视图在我 select 到 [=50] 后没有更新=] 我拍的照片。

这是我的绑定:

        set.Bind(imgPhoto).To(vm => vm.Bytes).WithConversion("InMemoryImage");
        set.Bind (btnTakePhoto).To ("TakePhoto");

imgPhoto 在哪里

public MvxImageView imgPhoto { get; set; }

而 btnTakePhoto 是

public UIButton btnTakePhoto { get; set; }

(我已尽力遵循 youtube 上 MVVMcross N+17 教程中使用的绑定语法 -(Stuart,如果您正在回答这个问题,谢谢!)

它在 android 上运行良好,使用相同的视图模型代码并像这样绑定到视图:

local:MvxBind="Bitmap Bytes, Converter=InMemoryImage; Visible Bytes;"

我在应用程序的设置 class 中添加了用于内存转换的引用程序集(我不必为 android 执行此操作):

    protected override List<Assembly> ValueConverterAssemblies {
        get {
            var toReturn = base.ValueConverterAssemblies;
            toReturn.Add(typeof(Cirrious.MvvmCross.Plugins.PictureChooser.Touch.MvxInMemoryImageValueConverter).Assembly);
            return toReturn;
        }
    }

并且我通过 nuget 添加了 picturechooser 插件,这样我就有了必要的 bootstrap 代码。

我也试过这个:

set.Bind(imgPhoto).For("Bitmap").To(vm => vm.Bytes).WithConversion("InMemoryImage");

而且我也尝试过使用 MvxImageViewLoader 并绑定到它而不是直接绑定到 MvxImageView,但也没有任何乐趣。

最后我也尝试在主线程上调用 PictureChooserTask,但也没有用。

感谢您的帮助!

UIImageView 上,属性 被称为 Image,您必须像这样绑定:

set.Bind(imgPhoto).For(v => v.Image).To(vm => vm.Bytes).WithConversion("InMemoryImage");

默认绑定 属性 是 ImageUrl。但是 MvxInMemoryImageValueConverter 转换为 UIImage。这就是为什么它必须绑定到 Image.