2

当我单击项目 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'}}"
  />

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

4

2 回答 2

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()); } }

如果这不起作用,那么请用测试代码提出一个错误- 网格是社区捐赠给 MvvmCross 的,所以它还不是我用过的东西。


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

如果您确实想做自定义绑定。

使用 Intellisense,看起来 anAdapterView.ItemClickEventArgs有几个潜在有用的属性:

        e.View;
        e.Position;

因此,您可以根据View需要访问 - 然后可以使用诸如FindViewById<>查找包含的视图之类的东西。

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


3) 我平时工作的方式

当我只想单击列表项或列表项的一部分时,我通常不会执行这种自定义绑定。

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

在这种方法中,ViewModel 公开了 aList<WrappedSquare>而不是 aList<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'}}" />

此示例代码改编自MvxBindableListView 中的 MVVMCross 更改 ViewModel - 那里的答案也与此问题相关。


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

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

于 2012-10-31T09:33:16.920 回答
1

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

绑定是关于 View-ViewModel 通信的。

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

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

于 2012-10-31T10:17:21.720 回答