![](/img/trans.png)
[英]MvvmCross: Different ItemClick commands in MvxListView for multiple layout
[英]App crash when I'm using MvxListview with ItemClick
我正在使用MvxListView并尝试将Command绑定到ItemClick事件,但是当我将ItemClick放入local:MvxBind属性时,我的应用程序在打开包含MvxListView的页面时崩溃。 如果我不在local:MvxBind中使用ItemClick,则MvxListView可以工作,但是如果我使用ItemClick,则在打开MvxListView页面时,应用程序将崩溃。
我的页面布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto/PROSPERI_EpmFast.Droid"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="0.05" />
<RelativeLayout
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="0.9">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1">
<TextView
android:id="@+id/headerTxtViewName"
android:text="@string/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="left"
android:layout_weight="0.3"
android:textColor="@color/epmfast_vermelho" />
<TextView
android:id="@+id/headerTxtViewStartDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@string/startDate"
android:gravity="left"
android:layout_weight="0.25"
android:textColor="@color/epmfast_vermelho" />
<TextView
android:id="@+id/headerTxtViewFinishtDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@string/finishDate"
android:gravity="left"
android:layout_weight="0.2"
android:textColor="@color/epmfast_vermelho" />
<TextView
android:id="@+id/headerTxtViewComplete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@string/complete"
android:gravity="left"
android:layout_weight="0.01"
android:textColor="@color/epmfast_vermelho" />
</LinearLayout>
<View
style="@style/Divider" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout2">
<Mvx.MvxListView
android:id="@+id/lstViewTasks"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:dividerHeight="1px"
android:clickable="true"
android:focusableInTouchMode="true"
android:choiceMode="singleChoice"
android:layout_alignParentTop="true"
local:MvxBind="ItemsSource Tasks, Mode=TwoWay; SelectedItem SelectedTask; ItemClick ItemClickCommand; "
local:MvxItemTemplate="@layout/projectmytasksitem" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="0.05" />
</LinearLayout>
我的ListItem布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto/PROSPERI_EpmFast.Droid"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/paddingDefaultItem"
android:paddingTop="@dimen/paddingDefaultItem">
<TextView
android:id="@+id/txtViewNameValue"
android:text="tarefa 1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="Text Name"
android:gravity="left"
android:layout_weight="0.18"
android:textSize="@dimen/fontDefaultMicro" />
<TextView
android:id="@+id/txtViewStartDateValue"
android:text="01/01/1111"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="Text StartDate, Converter=DateTimeToString"
android:gravity="left"
android:layout_weight="0.18"
android:textSize="@dimen/fontDefaultMicro" />
<TextView
android:id="@+id/txtViewFinishtDateValue"
android:text="01/01/1111"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="Text FinishDate, Converter=DateTimeToString"
android:gravity="left"
android:layout_weight="0.2"
android:textSize="@dimen/fontDefaultMicro" />
我的活动:
public class ProjectMyTasksView : MvxActivity
{
public new ProjectMyTasksViewModel viewModel
{
get { return (ProjectMyTasksViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
this.SetContentView(Resource.Layout.ProjectMyTasksView);
}
}
我的ViewModel:
public class ProjectMyTasksViewModel : MvxViewModel
{
#region [Atributos privados]
private ProjectService _service;
#endregion
#region [Propriedades]
private IList<Task> _tasks;
public IList<Task> Tasks
{
get { return _tasks; }
set { _tasks = value; RaisePropertyChanged(() => Tasks); }
}
private bool _isListaVazia;
public bool IsListaVazia
{
get { return _isListaVazia; }
set { _isListaVazia = value; RaisePropertyChanged(() => IsListaVazia); }
}
private Task _selectedTask;
public Task SelectedTask
{
get { return _selectedTask; }
set { _selectedTask = value; RaisePropertyChanged(() => SelectedTask); }
}
private string _mensagemErro;
public string MensagemErro
{
get { return _mensagemErro; }
set { _mensagemErro = value; RaisePropertyChanged(() => MensagemErro); }
}
#endregion
#region [Commands]
private MvxCommand _itemClickCommand;
public MvxCommand ItemClickCommand
{
get
{
_itemClickCommand = _itemClickCommand ?? new MvxCommand(ExecuteItemClickCommand);
return ItemClickCommand;
}
}
#endregion
#region [Construtores]
public ProjectMyTasksViewModel()
{
_service = new ProjectService();
this.CriaListaTeste();
IsListaVazia = (Tasks.Count > 0) ? true : false;
}
#endregion
#region [Execuções dos Comandos]
public void ExecuteItemClickCommand()
{
var taskJson = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(SelectedTask);
this.ShowViewModel<TaskViewModel>(new TaskViewModel.Parametros { TaskJson = taskJson });
}
#endregion
#region [Métodos]
public void CriaListaTeste()
{
Tasks = new List<Task>();
for (int indiceProjeto = 1; indiceProjeto <= 10; indiceProjeto++)
{
Tasks.Add(new Task { Name = $"Tarefa {indiceProjeto}", StartDate = DateTime.Now, FinishDate = DateTime.Now, IsCompleted = false });
}
}
#endregion
}
StackTrace:
05/04 10:27:03.407 W / Art(16616):JNI RegisterNativeMethods:尝试为mvvmcross.binding.droid.views.MvxListView注册0本机方法05-04 10:27:03.501 D / Mono(16616):组装Ref addref MvvmCross.Binding.Droid [0xb7205c70]-> System.Core [0xb731d880]:8 05-04 10:27:03.538 D / Mono(16616):程序集ref addref MvvmCross.Platform [0xb720b670]-> System.ObjectModel [ 0xb7226c78]:4 05-04 10:27:03.543 D / Mono(16616):程序集引用addref MvvmCross.Binding [0xb7204c50]-> System.Threading [0xb723c4b0]:3 05-04 10:27:03.580 D / Mono( 16616):程序集引用addref MvvmCross.Core [0xb7206b18]-> System.Threading [0xb723c4b0]:4 05-04 10:27:03.664 E / mono-rt(16616):Stacktrace:05-04 10:27:03.664 E / mono-rt(16616):05-04 10:27:03.664 E / mono-rt(16616):在<0xffffffff> 05-04 10:27:03.664 E / mono-rt(16616):在(包装管理-to-native)object.wrapper_native_0xb4f7f4c9(intptr,intptr,intptr,intptr,Android.Runtime.JValue *)05-04 10:27:03.664 E / mono-rt(16616):at(包装代理委托调用).invoke_in tptr_intptr_intptr_intptr_intptr_JValue *(intptr,intptr,intptr,intptr,Android.Runtime.JValue *)05-04 10:27:03.664 E / mono-rt(16616):在Android.Runtime.JNIEnv.CallNonvirtualObjectMethod(intptr,intptr, /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:612 05-04 10中的Android.Runtime.JValue *)[0x00060]: 27:03.664 E / mono-rt(16616):在/ Users / builder / data / lanes / 2970 / 46c3f7e0 / source /中的Android.Views.LayoutInflater.Inflate(int,Android.Views.ViewGroup,bool)[0x0009f] monodroid / src / Mono.Android / platforms / android-21 / src / generation / Android.Views.LayoutInflater.cs:689 05-04 10:27:03.664 E / mono-rt(16616):位于MvvmCross.Binding.Droid .Views.MvxLayoutInflater.Inflate(int,Android.Views.ViewGroup,bool)05-04 10:27:03.665 E / mono-rt(16616):at MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.CommonInflate(int,Android .Views.ViewGroup,bool)05-04 10:27:03.665 E / mono-rt(16616):at MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindi ngContext.BindingInflate(int,Android.Views.ViewGroup,bool)05-04 10:27:03.665 E / mono-rt(16616):at MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.BindingInflate(int,Android.Views。 ViewGroup)05-04 10:27:03.665 E / mono-rt(16616):位于MvvmCross.Binding.Droid.BindingContext.MvxBindingContextOwnerExtensions.BindingInflate(MvvmCross.Binding.BindingContext.IMvxBindingContextOwner,int,Android.Views.ViewGroup)05- 04 10:27:03.665 E / mono-rt(16616):在MvvmCross.Droid.Views.MvxActivity.SetContentView(int)05-04 10:27:03.665 E / mono-rt(16616):在PROSPERI_EpmFast.Droid。 C:\\ Projetos \\ PROSPERI_EpmFast \\ PROSPERI_EpmFast.Droid \\ Views \\ Activities \\ ProjectMyTasksView.cs:25 05-04 10:27:03.665 E / mono-中的Views.Activities.ProjectMyTasksView.OnCreate(Android.OS.Bundle)[0x00009] rt(16616):位于Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(intptr,intptr,intptr)[0x00011] /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/platforms/android -21 / SRC /生成/雄激素 id.App.Activity.cs:2707 05-04 10:27:03.666 E / mono-rt(16616):at(包装动态方法)object.fdbd2d8f-d719-4bb8-a51e-764cdabaeb71(intptr,intptr,intptr )05-04 10:27:03.666 E / mono-rt(16616):at(wrapper native-to-managed)object.fdbd2d8f-d719-4bb8-a51e-764cdabaeb71(intptr,intptr,intptr)05-04 10: 27:03.666 E / mono-rt(16616):05-04 10:27:03.666 E / mono-rt(16616):尝试原生Android stacktrace:05-04 10:27:03.666 E / mono-rt(16616) :05-04 10:27:03.680 E / mono-rt(16616):在??? + 3069880740 [0xa20db790] 05-04 10:27:03.693 E / mono-rt(16616):在??? + 3069880740 [0x0] 05-04 10:27:03.703 E / mono-rt(16616):05-04 10:27:03.703 E / mono-rt(16616):============== ================================================== == 05-04 10:27:03.703 E / mono-rt(16616):在执行本机代码时得到了SIGSEGV。 这通常表示05-04 10:27:03.703 E / mono-rt(16616):Mono运行时或本地库之一05-04 10:27:03.703 E / mono-rt(16616)中的致命错误:由您的应用程序使用。
问题是,您有无限的递归:
private MvxCommand _itemClickCommand;
public MvxCommand ItemClickCommand
{
get
{
_itemClickCommand = _itemClickCommand ?? new MvxCommand(ExecuteItemClickCommand);
return ItemClickCommand;
}
}
您必须返回_itemClickCommand
而不是ItemClickCommand
。 我个人不喜欢这个_xyz ?? new XYZ();
_xyz ?? new XYZ();
符号。 由于C#6,我更喜欢只读属性:
public MvxCommand ItemClickCommand { get; }
public MyClass()
{
ItemClickCommand = MvxCommand(ExecuteItemClickCommand);
}
不太确定这是否是问题所在,但您不需要SelectedTask
属性,因为您可以将其传递给ItemClicked
方法:
public void ExecuteItemClickCommand(Task task)
{
//Do stuff with task
var taskJson = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(task);
this.ShowViewModel<TaskViewModel>(new TaskViewModel.Parametros { TaskJson = taskJson });
}
public IMvxCommand ItemClickCommand
{
get
{
return new MvxCommand<Task> (ExecuteItemClickCommand);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.