【问题标题】:Return ImageView instance when i click on the item GridView当我单击项目 GridView 时返回 ImageView 实例
【发布时间】:2012-10-30 20:15:57
【问题描述】:

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

【问题讨论】:

  • 您最初将其标记为“C# android monocross” - 没有一个提醒我这是一个“monodroid mvvmcross”问题。

标签: c# android xamarin.android mvvmcross


【解决方案1】:

以下三个答案...我更喜欢标记为 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&lt;&gt; 之类的东西来查找包含的视图。

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


3) 我平时的工作方式

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

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

在这种方法中,ViewModel 公开 List&lt;WrappedSquare&gt; 而不是 List&lt;Square&gt;

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&lt;T&gt; 来启用从列表到详细视图的导航。

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

【讨论】:

  • 点击Item GridView时我需要它来运行动画和音乐
  • Click 只是一个 C# 委托 - 它可以多播到许多事件处理程序
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多