C# 单击GridView项时返回ImageView实例

C# 单击GridView项时返回ImageView实例,c#,android,xamarin.android,mvvmcross,C#,Android,Xamarin.android,Mvvmcross,单击GridView项时如何返回ImageView实例 我为ItemClick创建自定义绑定事件: public class ItemClickSquareBinding : MvxBaseAndroidTargetBinding { private readonly GridView _gridView; private IMvxCommand _command; public ItemClickSquareBindin

单击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; }
        }
    }
我的网格视图:

<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
      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'}}"
  />

我的图像视图:

<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
      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实例?(或者我如何返回单击我的对象的实例)

下面的三个答案。。。我喜欢标有3的那一个

1) 更简单的方法 在一个非常基本的层面上,我认为您可以使用内置绑定来实现这一点

查看
项目单击中的
,您应该能够:

<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'}}" />
如果这不起作用,那么请-网格是社区捐赠给MvvmCross的,所以我还没有使用过它


2) 使您的自定义绑定工作 如果您确实想进行自定义绑定

使用Intellisense,它看起来像一个
AdapterView。ItemClickEventArgs
有几个潜在的有用属性:

        e.View;
        e.Position;
因此,如果愿意,您可以访问
视图
,然后可以使用
FindViewById
之类的工具来查找包含的视图

或者您可以访问
位置
,然后可以: -使用适配器方法,如
public override Object GetItem(int-position)
从原始数组中获取Java包装的对象 -或者可以直接在传入数组或可枚举数组上使用访问器方法


3) 我通常的工作方式 当我只想单击列表项或列表项的一部分时,我通常不做这种自定义绑定

相反,我编写ViewModels,以便它们公开支持行为的集合—我尝试为模型对象而不是模型对象本身提供支持行为的包装器

在这种方法中,ViewModel公开了一个
列表
,而不是
列表

列表项中的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'}}" />

此示例代码改编自-那里的答案也与此问题相关


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

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

第四个答案(在对前三个答案进行评论之后…)

绑定与视图模型通信有关

动画不是ViewModel或绑定真正应该处理的事情


在我看来,最好为动画使用自定义控件。有关MonoDroid中的自定义控件,请参见

您最初将其标记为“C#android monocross”-没有任何一个提醒我这是一个“MonoDroid mvvmcross”问题。当您单击项目GridViewClick只是一个C#委托时,我需要它来运行动画和音乐-它可以多播到许多事件处理程序