如何在xamarin android中创建单项目选择mvx列表?

如何在xamarin android中创建单项目选择mvx列表?,android,xamarin,mvvmcross,Android,Xamarin,Mvvmcross,所以我正在用Xamarin和MvvmCross创建android应用程序。我需要制作一个显示所有项目的列表,您只能选择一个项目。如果已选择一个项目并尝试选择另一个项目,则不再选择第一个项目,并选择新项目 列表视图模型: public class ManagedPagesSelectViewModel : SharedViewModel { private ICollection<ManagedPagesSelectItemViewModel> _pag

所以我正在用Xamarin和MvvmCross创建android应用程序。我需要制作一个显示所有项目的列表,您只能选择一个项目。如果已选择一个项目并尝试选择另一个项目,则不再选择第一个项目,并选择新项目

列表视图模型:

    public class ManagedPagesSelectViewModel : SharedViewModel
    {
        private ICollection<ManagedPagesSelectItemViewModel> _pages;

        public ICollection<ManagedPagesSelectItemViewModel> Pages { get => _pages; set => SetProperty(ref _pages, value); }

        public ManagedPagesSelectViewModel() : base(navigation)
        {
        }

        public override async Task Initialize()
        {
            var tempPages = new Collection<ManagedPagesSelectItemViewModel>();
            await base.Initialize();
            IsLoading = true;

            try
            {

                tempPages.Add(new ManagedPagesSelectItemViewModel { Name = "testName", PhotoUrl = "asdasdasd", AccessToken = "asdasdasdasdasd" });
                tempPages.Add(new ManagedPagesSelectItemViewModel { Name = "testName1", PhotoUrl = "asdasdasd1", AccessToken = "asdasdasdasdasd1" });

                Pages = tempPages;
            }
            catch (Exception ex)
            {
                Error = "Could not load managed pages list";
            }

            IsLoading = false;
        }    
    }
public class ManagedPagesSelectItemViewModel : MvxViewModel
{
    private string _name;
    private string _url;
    private string _accessToken;
    private bool _isSelected;

    public string Name { get => _name; set => SetProperty(ref _name, value); }
    public string PhotoUrl { get => _url; set => SetProperty(ref _url, value); }
    public string AccessToken { get => _accessToken; set => SetProperty(ref _accessToken, value); }
    public bool IsSelected { get => _isSelected; set => SetProperty(ref _isSelected, value); }

    public IMvxCommand SelectCommand => new MvxCommand(SelectCommandHandler);

    public void SelectCommandHandler()
    {
        IsSelected = !IsSelected;
    }
}
列表视图:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">
        <RelativeLayout
        android:layout_width="match_parent"
        android:background="@color/abc_search_url_text_normal"
        android:layout_height="50dp" />
       <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="200dp"
       android:paddingTop="50dp">
       <Mvx.MvxListView
        android:padding="5dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        local:MvxItemTemplate="@layout/managedpagelistitem"
        android:layout_gravity="bottom"
        local:MvxBind="ItemsSource Pages"
        android:choiceMode="singleChoice" />
</RelativeLayout>
<RelativeLayout
    android:layout_width="match_parent"
    android:background="@color/abc_search_url_text_normal"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:minWidth="25px"
    android:minHeight="25px">
</RelativeLayout>
和列表项视图:

<?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"
local:MvxBind="Click SelectCommand"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="25px"
android:minHeight="25px">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/block"
    android:elevation="2dp"
    android:orientation="horizontal"
    android:gravity="center_vertical">
    <TextView
        local:MvxBind="Text Name"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:textColor="#000000"
        android:layout_marginLeft="20dp"
        android:gravity="center_vertical" />
    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />
    <CheckBox
        local:MvxBind="Checked IsSelected"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/checkBox1" />
</LinearLayout>

我做错了什么?我只是不知道如果选择了新项,如何从旧项中删除IsSelected…

一种方法是将您的SelectCommand放入ManagedPagesSelectViewModel中并与该项一起切换选择,同时保存选择并考虑在选择当前项之前将其选择切换为false:

public class ManagedPagesSelectViewModel : SharedViewModel
{
    ...

    private ManagedPagesSelectItemViewModel lastSelectedItem;

    public MvxCommand<ManagedPagesSelectItemViewModel> SelectCommand => new MvxCommand<ManagedPagesSelectItemViewModel>(SelectCommandHandler);

    public void SelectCommandHandler(ManagedPagesSelectItemViewModel  item)
    {
        if(this.lastSelectedItem != null)
            this.lastSelectedItem.IsSelected = false;

        item.IsSelected = !item.IsSelected;
        this.lastSelectedItem = item;
    }    
}
另一种方法是使用select命令处理程序中的相同绑定取消选择所有项并选择当前项:

public class ManagedPagesSelectViewModel : SharedViewModel
{
    ...

    public MvxCommand<ManagedPagesSelectItemViewModel> SelectCommand => new MvxCommand<ManagedPagesSelectItemViewModel>(SelectCommandHandler);

    public void SelectCommandHandler(ManagedPagesSelectItemViewModel  item)
    {
        foreach(ManagedPagesSelectItemViewModel i in this.Pages)
            i.IsSelected = false;

        item.IsSelected = !item.IsSelected;
    }    
}

HIH

您编写的命令正在获取参数项。视图中不应该有参数绑定吗?因为目前,我已经尝试了你的方法,但它不起作用。单击项目时不调用该命令。不必介意先添加注释,当我从项目视图中删除复选框时,我注意到一切都正常。
public class ManagedPagesSelectViewModel : SharedViewModel
{
    ...

    public MvxCommand<ManagedPagesSelectItemViewModel> SelectCommand => new MvxCommand<ManagedPagesSelectItemViewModel>(SelectCommandHandler);

    public void SelectCommandHandler(ManagedPagesSelectItemViewModel  item)
    {
        foreach(ManagedPagesSelectItemViewModel i in this.Pages)
            i.IsSelected = false;

        item.IsSelected = !item.IsSelected;
    }    
}