当我点击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实例? (或者我如何返回点击我的对象实例)
答案 0 :(得分:2)
以下三个答案......我更喜欢标有 3
的答案在一个非常基本的层面上,我认为你可以使用内置绑定。
查看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所以它不是我用过的东西。
如果您确实想要进行自定义绑定。
使用Intellisense,看起来AdapterView.ItemClickEventArgs
有几个可能有用的属性:
e.View;
e.Position;
因此,如果您愿意,可以访问View
,然后可以使用FindViewById<>
之类的内容查找包含的视图。
或者您可以访问Position
,然后可以:
- 使用像public override Object GetItem(int position)
这样的Adapter方法从原始数组中获取Java包装对象
- 或者可以直接在传入的数组上使用存取方法或可枚举。
当我想要做的只是单击列表项或列表项的一部分时,我通常不会执行此类自定义绑定。
相反,我编写了我的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?