绑定到MvvmCross中的Path ImageView for MonoDroid / Android

时间:2012-10-16 23:38:04

标签: c# mono xamarin.android mvvmcross

在我的案例路径"MyZooSnap.Core;component/Resources/Images/i.jpg"中。 如何转换Android ImageView的路径? 为了在以下绑定中使用它:

{'AssetImagePath':{'Path':'ImagePath'}}

More here

similar questions

由于

4 个答案:

答案 0 :(得分:5)

快速回答:

  • 如果您的Android图片文件存储在assets/images/i1.png
  • 然后确保将其标记为AndroidAsset
  • 然后您的路径必须是images/i1.png

更长的答案:

理想情况下,您的ViewModel应该与平台无关,而且不了解View关注点。

因此,您的ViewModel可能会公开如下属性:

 private GameState _state;
 public GameState State 
 { 
     get { return _state; }
     set { _state = value; RaisePropertyChanged(() => State); }
 }

其中GameState是一个枚举,如:

 public enum GameState
 {
     Stopped,
     Running,
     Paused,
     GameOver
 }

然后,您可能会在资产结构中拥有代表这些状态的图像,如:

/assets/gamestates/stopped.png
/assets/gamestates/running.png
/assets/gamestates/paused.png
/assets/gamestates/gameover.png

其中每个文件都标有AndroidAsset的BuildAction。

要在UI中显示正确的图像,您需要一个值转换器,如:

public class GameStateConverter
    : MvxBaseValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return string.Format("gamestates/{0}.png", ((GameState)value).ToString().ToLower());
    }
}
使用转换器包装器映射

,如:

public class Converters
{
    public readonly GameStateConverter GameState = new GameStateConverter();
}

使用以下命令在setup.cs中配置:

    protected override IEnumerable<Type> ValueConverterHolders
    {
        get { return new[] { typeof(Converters) }; }
    }

有了这个,那么你的axml绑定语句将是:

    {'AssetImagePath':{'Path':'State', 'Converter':'GameState'}}

有关使用资源而非资源的替代方法,请参阅Іssue with binding to GridLayout to Android

中的MvxButtonIconBinding

答案 1 :(得分:0)

我无法解决问题。 我的MainViewModel.cs

public class MainMenuViewModel
    : MvxViewModel
{
    private const string path = "myimage";

    public List<SquareModel> Items { get; set; }

    public IMvxCommand ShowItemCommand
    {
        get
        {
            return new MvxRelayCommand<Type>((type) => this.RequestNavigate(typeof(MainMenuViewModel)));
        }
    }

    public MainMenuViewModel()
    {
        Items = GetCollection();
    }

    public List<SquareModel> GetCollection()
    {
        List<SquareModel> col = new List<SquareModel>();
        for (int i = 0; i < 20; i++)
        {
            col.Add(new SquareModel { ID = i, PathImage = path });
        }
        return col;
    }
}

我的Converts.cs

public class Converters
{
    public readonly PathImageConverter GameImage = new PathImageConverter();
}

我的PathImageConverter.cs

public class PathImageConverter
    : MvxBaseValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return string.Format("squareresources/{0}.png", value.ToString().ToLower());
    }
}

我的Setup.cs

public class Setup
    : MvxBaseAndroidBindingSetup
{
    public Setup(Context applicationContext)
        : base(applicationContext)
    {
    }

    protected override MvxApplication CreateApp()
    {
        return new App();
    }

    protected override IEnumerable<Type> ValueConverterHolders
    {
        get { return new[] { typeof(Converters.Converters) }; }
    }
}

我的GameView.axml

<cirrious.mvvmcross.binding.android.views.MvxBindableGridView
                  xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:local="http://schemas.android.com/apk/res/MyZooSnap.UI"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:numColumns="4"
                  android:verticalSpacing="10dp"
                  android:horizontalSpacing="10dp"
                  android:gravity="center"
                  local:MvxItemTemplate="@layout/itemimage"
                  local:MvxBind="{'ItemsSource':{'Path':'Items'}}" />

我的ItemImage.axml

<ImageView
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:local="http://schemas.android.com/apk/res/MyZooSnap.UI"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:padding="10dp"
  local:MvxBind="{'AssetImagePath':{'Path':'PathImage', 'Converter':'GameImage'}}"

/&GT;

我的UI项目 :enter image description here

答案 2 :(得分:0)

当图像放在文件夹Assets中时,表示只需指明图片的名称 - 它可以正常工作。 当它创建另一个文件夹并指定路径时:

/asset/folder/image.png
asset/folder/image.png
/folder/image.png
folder/image.png

不起作用!

答案 3 :(得分:0)

<Mvx.MvxImageView
    android:layout_width="40dp"
    android:layout_height="40dp"
    local:MvxBind="AssetImagePath PathImage,Converter=GameImage" />

也应该工作