Xamarin MVVM 处理文件

Posted

技术标签:

【中文标题】Xamarin MVVM 处理文件【英文标题】:Xamarin MVVM working with files 【发布时间】:2016-10-29 08:57:24 【问题描述】:

我正在使用 Xamarin 和 MVVM 为 iosandroid 开发应用程序。应用程序应该上传\下载文件到\从服务器。详细来说,Android 上有一个按钮,点击它 Android 文件选择器打开,我正在获取文件。在 iOS 中也是如此。问题是我试图将文件作为 Stream 发送到 viewmodel,但在 Android 中它是 Android.Runtime.InputStreamInvoker 而在 iOS 中是 NSData。是否有任何通用方法可以将文件流发送到视图模型或任何转换?并且投射到流不起作用,当我发送它不是视图模型时,我无法从流中获取任何信息。也许有人遇到过这样的问题。

以Android接收文件为例:

public override void OnActivityResult(int requestCode, int resultCode, Intent intent)

    base.OnActivityResult(requestCode, resultCode, intent);
    if (resultCode == (int)Result.Ok)
    
        var returnUri = intent.Data;
        var mimeType = _baseActivity.ContentResolver.GetType(returnUri);
        var returnCursor =
                _baseActivity.ContentResolver.Query(returnUri, null, null, null, null);
        int nameIndex = returnCursor.GetColumnIndex(OpenableColumns.DisplayName);
        int sizeIndex = returnCursor.GetColumnIndex(OpenableColumns.Size);
        returnCursor.MoveToFirst();
        var name = returnCursor.GetString(nameIndex);
        var size = returnCursor.GetLong(sizeIndex);

        var inputStream = (Android.Runtime.InputStreamInvoker) _baseActivity.ContentResolver.OpenInputStream(returnUri);
        var count = inputStream.BaseInputStream.Available();

        //then I want to send inputStrea here what to do next??
    

我知道我可以读取整个文件并将其复制到例如MemoryStream 并发送,但它非常慢且不好,我正在寻找一种无需复制的方法。

【问题讨论】:

【参考方案1】:

有时在这种情况下,我只需将属性键入为System.Object。绑定系统在运行时使用反射来访问属性,因此您的属性使用什么具体类型并不重要。

这假定任何连接到您的视图模型的东西都可以在该平台上获取 NSData(在 iOS 上)或 Android 等效项。

【讨论】:

以上是关于Xamarin MVVM 处理文件的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin: MVVM交叉信息

Xamarin.Forms MVVM TapGestureRecognizer 到 ListView 的 ViewCell 中的标签(在部分文件中)

在 Xamarin.Forms 中使用 MVVM 进行页面导航

Xamarin.forms MVVM。列表视图仍然为空

Xamarin 中的 MVVM 绑定

Xamarin Forms MvvM框架之FreshMvvM翻译一