2015-12-09 31 views
1

我有一个MvxFragment绑定到一个视图模型,它有两个ICommand属性定义。该片段包含一个MvxListView,并且可以是取决于设备大小/方向的不同活动/布局的一部分。MVVMCross片段和动态设置事件命令

我想知道的是如何动态指定MvxListView的MvxBind属性的ItemClick事件命令,还是有更好的方式来处理此用例?我应该使用单独的片段吗?

一个类似用途的情况下,以一个我想要实现这个Xamarin Dev Guide

查看

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <MvxListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     local:MvxBind="ItemsSource Courses; ItemClick Comamnd1" 
     local:MvxItemTemplate="@layout/coursetemplate" /> 
</LinearLayout> 

视图模型(Simpified)概述部分

public class MyViewModel : MvxViewModel 
{ 
    private MvxCommand<MyMessage> messageCommand; 

    public MyViewModel (IMvxMessenger messenger, IHttpClientBuilderService httpClientBuilder) 
    { 
     this.httpClientBuilder = httpClientBuilder; 
     this.messenger = messenger; 
    } 

    public ICommand Comamnd1 { 
     get { return new MvxCommand<Course> ((c) => ShowViewModel<MyOtherViewModel>(c)); } 
    } 

    public ICommand Command2 { 
     get 
     { 
      messageCommand = messageCommand ?? new MvxCommand<MyMessage>(c => 
       { 
        var message = new MyMessage(this, c); 
        messenger.Publish(message);      
       }); 
      return selectedCourse; 
     } 
    } 

} 

回答

1

好的,你可以这样做我的覆盖OnActivityCreated事件的片段如下。

public override void OnActivityCreated (Bundle savedInstanceState) 
    { 
     base.OnActivityCreated (savedInstanceState); 

     MvxListView list = Activity.FindViewById<MvxListView>(Resource.Id.[theID]); 

     if (Activity.FindViewById<View>(Resource.Id.[fragmentID]) != null) 
      list.ItemClick = ((MyViewModel)ViewModel).Command1; 
     else 
      list.ItemClick = ((MyViewModel)ViewModel).Command2; 
    } 

您可以通过使用Activity.FindViewById功能拉出列表,然后通过list.ItemClick事件设置为从视图模型的appropraite ICommandIMvxCommand