我正在使用MvxListView并尝试将Command绑定到ItemClick事件,但是当我将ItemClick放入local:MvxBind属性时,我的应用程序崩溃时打开包含MvxListView的页面。如果我不在本地使用ItemClick:MvxBind,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):Assembly Ref addref MvvmCross.Binding.Droid [0xb7205c70] - &gt; System.Core [0xb731d880]:8 05-04 10:27:03.538 D / Mono(16616):Assembly Ref addref MvvmCross.Platform [0xb720b670] - &gt; System.ObjectModel [0xb7226c78]:4 05-04 10:27:03.543 D / Mono(16616):Assembly Ref addref MvvmCross.Binding [0xb7204c50] - &gt; System.Threading [0xb723c4b0]:3 05-04 10:27:03.580 D / Mono(16616):Assembly Ref addref MvvmCross.Core [0xb7206b18] - &gt; System.Threading [0xb723c4b0]:4 05-04 10:27:03.664 E / mono-rt(16616):Stacktrace: 05-04 10:76:03.664 E / mono-rt(16616): 05-04 10:27:03.664 E / mono-rt(16616):at&lt; 0xffffffff&gt; 05-04 10:27:03.664 E / mono-rt(16616):at(包装器托管到原生)object.wrapper_native_0xb4f7f4c9(intptr,intptr,intptr,intptr,Android.Runtime.JValue *) 05-04 10:27:03.664 E / mono-rt(16616):at(wrapper delegate-invoke).invoke_intptr_intptr_intptr_intptr_intptr_JValue *(intptr,intptr,intptr,intptr,Android.Runtime.JValue *) 05-04 10:27:03.664 E / mono-rt(16616):在/ Users / builder / data /中的Android.Runtime.JNIEnv.CallNonvirtualObjectMethod(intptr,intptr,intptr,Android.Runtime.JValue *)[0x00060]泳道/ 2970 / 46c3f7e0 /源极/ MonoDroid的/ SRC / Mono.Android / SRC /运行时间/ JNIEnv.g.cs:612 05-04 10:27:03.664 E / mono-rt(16616):在/ Users / builder / data / lanes / 2970中的Android.Views.LayoutInflater.Inflate(int,Android.Views.ViewGroup,bool)[0x0009f] /46c3f7e0/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/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):在MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.CommonInflate(int,Android.Views.ViewGroup,bool) 05-04 10:27:03.665 E / mono-rt(16616):在MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.BindingInflate(int,Android.Views.ViewGroup,bool) 05-04 10:27:03.665 E / mono-rt(16616):在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):位于C:\ Projetos \ PROSPERI_EpmFast \ PROSPERI_EpmFast.Droid的PROSPERI_EpmFast.Droid.Views.Activities.ProjectMyTasksView.OnCreate(Android.OS.Bundle)[0x00009] \查看\活动\ ProjectMyTasksView.cs:25 05-04 10:27:03.665 E / mono-rt(16616):位于/ Users / builder / data / lanes / 2970 / 46c3f7e0 / source中的Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(intptr,intptr,intptr)[0x00011] /monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.App.Activity.cs:2707 05-04 10:27:03.666 E / mono-rt(16616):at(wrapper dynamic-method)object.fdbd2d8f-d719-4bb8-a51e-764cdabaeb71(intptr,intptr,intptr) 05-04 10:27:03.666 E / mono-rt(16616):at(包装器本机到托管)object.fdbd2d8f-d719-4bb8-a51e-764cdabaeb71(intptr,intptr,intptr) 05-04 10:76:03.666 E / mono-rt(16616): 05-04 10:27:03.666 E / mono-rt(16616):尝试原生Android堆栈跟踪: 05-04 10:76:03.666 E / mono-rt(16616): 05-04 10:27:03.680 E / mono-rt(16616):at ??? + 3069880740 [0xa20db790] 05-04 10:76:03.693 E / mono-rt(16616):at ??? + 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):单声道运行时或其中一个本机库中的致命错误 05-04 10:27:03.703 E / mono-rt(16616):您的应用程序使用。
答案 0 :(得分:2)
问题是,你有无限的递归:
private MvxCommand _itemClickCommand;
public MvxCommand ItemClickCommand
{
get
{
_itemClickCommand = _itemClickCommand ?? new MvxCommand(ExecuteItemClickCommand);
return ItemClickCommand;
}
}
您必须返回_itemClickCommand
而不是ItemClickCommand
。就个人而言,我不喜欢这种_xyz ?? new XYZ();
符号。从C#6开始,我更喜欢readonly属性:
public MvxCommand ItemClickCommand { get; }
public MyClass()
{
ItemClickCommand = MvxCommand(ExecuteItemClickCommand);
}
答案 1 :(得分:0)
不太确定这是否是问题,但您不需要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);
}
}