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

私の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インスタンスを返す方法は? (または、私をクリックしたオブジェクトのインスタンスを返す方法)

4

2 に答える 2

2

以下の3つの答え...私は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) カスタムバインディングを機能させるには

カスタムバインディングを行いたい場合。

AdapterView.ItemClickEventArgsIntellisense を使用すると、 には潜在的に有用なプロパティがいくつかあるように見えます。

        e.View;
        e.Position;

Viewそのため、必要に応じて にアクセスし、FindViewById<>含まれているビューなどを使用して見つけることができます。

または、にアクセスして、次のことができますPosition。 - 元の配列から Java でラップされたオブジェクトを取得するなどのアダプタ メソッドpublic override Object GetItem(int position)を使用するか、着信配列または列挙型に対して直接アクセサ メソッドを使用できます。


3) 普段の働き方

リスト項目またはリスト項目の一部をクリックするだけの場合は、通常、この種のカスタム バインドは行いません。

代わりに、振る舞い対応のコレクションを公開するように ViewModel を作成します。つまり、Model オブジェクト自体ではなく、Model オブジェクトの振る舞い対応のラッパーを提示しようとします。

このアプローチでは、ViewModelList<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'}}" />

このコード例は、MvxBindableListView 内で ViewModel を変更する MVVMCrossから適応されています。そこにある回答は、この質問にも関連しています。


このアプローチの実際の例の 1 つは、WithCommand<T>リストから詳細ビューへのナビゲーションを可能にする Conference サンプルです。

ただし...このアプローチには1つの警告があります-使用時にiOS/MonoTouchでメモリリークが発見されたことに注意してくださいWithCommand<T>-基本的にGarbageCollectionは埋め込みの収集を拒否しましたMvxRelayCommand-これが理由WithCommand<T>IDisposableありBaseSessionListViewMode、リストをクリアしてWithCommand要素を破棄する理由ですビューは切り離されています。

于 2012-10-31T09:33:16.920 に答える
1

4番目の答え(前の3つのコメントの後...)

バインディングは、View-ViewModel通信に関するものです。

アニメーションは、ViewModelやBindingが実際に処理する必要のあるものではありません。

私の意見では、アニメーションにカスタムコントロールを使用したほうがよいと思います。MonoDroidのカスタムコントロールについては、Xamarin Monodroid:WP7 => Androidとカスタムコントロール?を​​参照してください。

于 2012-10-31T10:17:21.720 に答える