单击GridView项时返回ImageView实例

时间:2012-10-30 20:15:58

标签: c# android xamarin.android mvvmcross

当我点击GridView项目时如何返回ImageView实例?

我为ItemClick创建自定义绑定事件:

public class ItemClickSquareBinding
        : MvxBaseAndroidTargetBinding
    {
        private readonly GridView _gridView;
        private IMvxCommand _command;

        public ItemClickSquareBinding(GridView gridView)
        {
            _gridView = gridView;
            _gridView.ItemClick += GridView_ItemClick;
        }

        private void GridView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {
            //----->Get ImageView
        }

        public override void SetValue(object value)
        {
            _command = (IMvxCommand)value;
        }

        protected override void Dispose(bool isDisposing)
        {
            if (isDisposing)
            {
                _gridView.ItemClick -= GridView_ItemClick;
            }
            base.Dispose(isDisposing);
        }

        public override Type TargetType
        {
            get { return typeof(IMvxCommand); }
        }

        public override MvxBindingMode DefaultMode
        {
            get { return MvxBindingMode.OneWay; }
        }
    }

我的GridView:

<cirrious.mvvmcross.binding.android.views.MvxBindableGridView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:numColumns="4"
        android:gravity="center"
        android:listSelector="#00000000"
        local:MvxItemTemplate="@layout/itemimage"
        local:MvxBind="{'ItemsSource':{'Path':'Squares'}, 'ClickItemSquare':{'Path':'ClickCommand'}}" />

我的ImageView:

<ImageView
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:local="http://schemas.android.com/apk/res/LeSommet.ZooSnap.UI.Android"
      android:layout_width="80dp"
      android:layout_height="80dp"
      android:padding="5dp"
      android:layout_gravity="center"
      local:MvxBind="{'ResourcesImagePath':{'Path':'ImagePath'}}"
  />

当我点击GridView项目时如何返回ImageView实例? (或者我如何返回点击我的对象实例)

2 个答案:

答案 0 :(得分:2)

以下三个答案......我更喜欢标有 3

的答案

1)更简单的方法

在一个非常基本的层面上,我认为你可以使用内置绑定。

查看https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxBindableGridView.cs中的ItemClick,您应该能够做到:

<cirrious.mvvmcross.binding.android.views.MvxBindableGridView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="4"
    android:gravity="center"
    android:listSelector="#00000000"
    local:MvxItemTemplate="@layout/itemimage"
    local:MvxBind="{'ItemsSource':{'Path':'Squares'}, 'ItemClick':{'Path':'ClickCommand'}}" />

其中ClickCommand类似于:

public ICommand ClickCommand { get { return new MvxRelayCommand<Square>(square => square.Foo()); } }

如果这不起作用,那么请raise a bug with test code - 网格是社区捐赠给MvvmCross所以它不是我用过的东西。


2)使您的自定义绑定工作

如果您确实想要进行自定义绑定。

使用Intellisense,看起来AdapterView.ItemClickEventArgs有几个可能有用的属性:

        e.View;
        e.Position;

因此,如果您愿意,可以访问View,然后可以使用FindViewById<>之类的内容查找包含的视图。

或者您可以访问Position,然后可以: - 使用像public override Object GetItem(int position)这样的Adapter方法从原始数组中获取Java包装对象 - 或者可以直接在传入的数组上使用存取方法或可枚举。


3)我正常工作的方式

当我想要做的只是单击列表项或列表项的一部分时,我通常不会执行此类自定义绑定。

相反,我编写了我的ViewModel,以便它们公开启用行为的集合 - 我尝试提供Model对象的行为启用包装器而不是Model对象本身。

在此方法中,ViewModel公开了List<WrappedSquare>而不是List<Square>

public WrappedSquare
{
   Square _saure;
   SquareViewModel _square;

   public WrappedSquare(Square square, SquareViewModel parent)
   {
       /* assignment */
   }

   public ICommand TheCommand { get { return MvxRelayCommand(() -> _parent.DoStuff(_square)); } }

   public Square TheSquare { get { return _square; } } 
}

列表项中的axml具有如下绑定:

<ImageView
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:local="http://schemas.android.com/apk/res/LeSommet.ZooSnap.UI.Android"
      android:layout_width="80dp"
      android:layout_height="80dp"
      android:padding="5dp"
      android:layout_gravity="center"
      local:MvxBind="{'ResourcesImagePath':{'Path':'TheSquare.ImagePath'},'Click':{'Path':'TheCommand'}}"
  />

并且网格的axml是:

<cirrious.mvvmcross.binding.android.views.MvxBindableGridView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="4"
    android:gravity="center"
    android:listSelector="#00000000"
    local:MvxItemTemplate="@layout/itemimage"
    local:MvxBind="{'ItemsSource':{'Path':'WrappedSquares'}}" />

此示例代码改编自MVVMCross changing ViewModel within a MvxBindableListView - 答案也与此问题相关。


此方法的一个真实示例是会议示例,该示例使用WithCommand<T>启用从列表到详细视图的导航。

然而......这种方法有一个警告 - 请注意,当使用WithCommand<T>时我们发现iOS / MonoTouch中存在内存泄漏 - 基本上GarbageCollection拒绝收集嵌入式MvxRelayCommand - 这就是为什么WithCommand<T>IDisposable以及为什么BaseSessionListViewMode清除列表并在分离视图时处置WithCommand元素的原因。

答案 1 :(得分:1)

第四个答案(在对前三个评论后......)

绑定是关于View-ViewModel通信。

动画不是ViewModel或Binding应该真正处理的东西。

在我看来,最好为动画使用自定义控件。有关MonoDroid中的自定义控件,请参阅Xamarin Monodroid: WP7 => Android and Custom Control?