如何使用Mvvmcross将图像src绑定到资源可绘制图像?

时间:2012-10-13 19:50:22

标签: xamarin.android mvvmcross

我正在尝试绑定图片的src。

我尝试过像这样使用MvxHttpImageView

<Mvx.MvxHttpImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/iconeView"
                local:MvxBind="{'ImageUrl':{'Path':'ImgSrc'}}" />

public string ImgSrc
{
    get {return "@res/drawable/icon.png"; }
}

我已经尝试了其他几个ImgSrc但仍然没有任何结果。

icon.png位于我的Resources / Drawable目录中,是一个AndroidResource

任何帮助都会很棒! 感谢

4 个答案:

答案 0 :(得分:14)

较新版本的MvvmCross支持绑定到可绘制资源。使用DrawableName binding,您可以将ImageView绑定到包含可绘制名称的viewmodel上的属性。

using System;
using Cirrious.MvvmCross.ViewModels;

namespace MyApp.ViewModels
{
    public class UserProfileViewModel : MvxViewModel
    {    
            // set this to the name of one of the files
            // in your Resources/drawable/drawable-xxxx folders
        private MyDrawable _myDrawable;
        public string MyDrawable { 
            get { return _myDrawable; }
            set {
                _myDrawable = value;
                RaisePropertyChanged (() => MyDrawable);
            }
        }
    }
}

并在你的布局中

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        local:MvxBind="DrawableName MyDrawable"/>

或者,如果您的VM属性为int

,则可以使用Drawable binding

答案 1 :(得分:6)

mvxhttpimageview知道如何从http和'disk'

加载图像

可悲的是,它不知道如何从资源加载

但是,有一些方法可以让图像加载静态内容。

  1. 您可以编写自己的自定义绑定
  2. 您可以使用标准imageview,存储在android资产中的图像以及内置于mvx中的'AssetImagePath'绑定。
  3. 要尝试第一个,请查看会议示例 - 最喜欢的按钮背景如何绑定到IsFavorite

    做第二个:

    • 在资产文件夹中包含图标 - 例如/assets/icon1.png
    • 确保构建操作设置为AndroidAsset
    • XML中的
    • 使用标准的ImageView和绑定文本,如{'AssetImagePath':{'Path':'WhichAsset'}}

    在实际使用中,我通常也使用转换器 - 将状态视图模型属性映射为具有值LoadingState.Loading到资产图像路径(如'/loadingimages/loading.png')


    您可以在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/Android/Target/MvxImageViewDrawableTargetBinding.cs

    中查看资产绑定的代码

    抱歉,答案中不包含更多代码 - 在移动设备上接听

答案 2 :(得分:4)

我构建了一个转换器,它将一个可绘制的名称转换为一个Bitmap,并将Bitmap绑定到ImageView。

转换器:

public class ImageNameToBitmapConverter : MvxValueConverter<string, Bitmap>
{
    protected override Bitmap Convert(string value, Type targetType, object parameter, CultureInfo culture)
    {

        var topActivity = Mvx.Resolve<IMvxAndroidCurrentTopActivity>();

        var bm = BitmapFactory.DecodeResource(topActivity.Activity.Resources, GetResourceId(value, "drawable", topActivity));

        return bm;
    }

    private static int GetResourceId(string variableName, string resourceName, IMvxAndroidCurrentTopActivity topActivity)
    {
        try
        {
            return topActivity.Activity.Resources.GetIdentifier(variableName, resourceName, topActivity.Activity.PackageName);
        }
        catch (Exception)
        {
            return -1;
        }
    }
}

XML视图:

<ImageView
    local:MvxBind="Bitmap Icon, Converter=ImageNameToBitmap"
    android:layout_width="100dp"
    android:layout_height="100dp" />

Icon属性我的绑定是一个字符串,如:&#34; icon_name &#34;我将图片icon_name.png放在Android项目的Resources/drawable

答案 3 :(得分:0)

对于最新的MvvmCross,下一个解决方案是实际的:

在标记中:

<ImageView
    android:id="@+id/iconImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:layout_centerVertical="true"
    local:MvxBind="DrawableName Type, Converter=TypeToImageStringConverter" />

转换器:

public class TypeToImageStringConverter : MvxValueConverter<VacationType, int>
{
    protected override int Convert(VacationType value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        switch (value)
        {
            case VacationType.RegularVacation:
                return Resource.Drawable.Icon_Request_Green;
            case VacationType.SickLeave:
                return Resource.Drawable.Icon_Request_Blue;
            case VacationType.LeaveWithoutPay:
                return Resource.Drawable.Icon_Request_Dark;
            case VacationType.OvertimeVacation:
                return Resource.Drawable.Icon_Request_Gray;
            case VacationType.ExceptionalLeave:
                return Resource.Drawable.Icon_Request_Plum;
            default:
                return Resource.Drawable.Icon_Request_Gray;
        }
    }
}

所有意义都是你必须提供一个可绘制的资源ID。