MvvmCross MvxListView ItemClick启用基于属性

时间:2017-02-17 09:20:59

标签: xamarin mvvmcross mvxlistview

所以我有一个MvxListView

<Mvx.MvxListView
    android:id="@+id/receptionsListView"
    android:divider="@drawable/divider"
    android:scrollbars="vertical"
    android:choiceMode="singleChoice"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    local:MvxItemTemplate="@layout/item_supplier"
    local:MvxBind="ItemsSource ReceptionSuppliersList;  ItemClick SelectReceptionCommand;" />

我想根据列表中模型的值启用/禁用某些项目。像

这样的东西
  local:MvxBind="ItemsSource ReceptionSuppliersList; ItemClick SelectReceptionCommand; Enabled ReceptionSuppliersList.IsValid" />

根据我测试的内容,我刚刚禁用了所有列表项,因为没有这样的属性ReceptionSuppliersList.IsValid(它的ReceptionSuppliersList [i] .IsValid)。我怎样才能实现这个目标。

我还尝试在item_supplier上添加Enabled Property,就像这样

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="0dp"
    style="@style/ExtendProTheme.ReceptionItem"
    local:MvxBind="Enabled IsValid" >

但它仍然无效。

任何想法如何根据属性禁用我的列表中的某些项目?

PS: 我的项目看起来像这样

public string Username { get; set; }

public string DeviceId { get; set; }

public bool IsValid { get; set; }

2 个答案:

答案 0 :(得分:1)

您可以创建自定义适配器来处理列表项的启用/禁用。您只需要将适配器ItemsSource强制转换为ViewModel ReceptionSuppliersList在IsEnabled覆盖中输入。

public class CustomAdapter : MvxAdapter
{
    public CustomAdapter(Context context) 
        : base(context)
    {
    }

    public CustomAdapter(Context context, IMvxAndroidBindingContext bindingContext) 
        : base(context, bindingContext)
    {
    }

    protected CustomAdapter(IntPtr javaReference, JniHandleOwnership transfer) :
        base(javaReference, transfer)
    {
    }

    public override bool IsEnabled(int position)
    {
        var items = ItemsSource as List<TestModel>;
        return items[position].IsValid;
    }
}

将适配器分配给MvxListView:

var receptionsListView = FindViewById<MvxListView>(Resource.Id.receptionsListView);
receptionsListView.Adapter = new CustomAdapter(this, BindingContext as IMvxAndroidBindingContext);

答案 1 :(得分:0)

这不是一个真正的问题解决方案,但它应该适合您的情况:

  1. 在项目上添加灰色叠加层,使其看起来没有启用。
  2. 检查是否在SelectReceptionCommand的方法处理程序上启用了项目。
  3.     
        private void OnSelectReceptionCommandExecuted(Reception item)
                {
                    if (!reception.IsEnabled)
                    {
                        return;
                    }
                    // your code here
                }