简体   繁体   English

从Xamarin表单的Listview获取检查值

[英]Get checked values from Listview in Xamarin forms

I am new to xamarin as well as for the C#. 我是Xamarin和C#的新手。 I have a listview in my app and I am binding data through ItemsSource. 我的应用程序中有一个listview,并且正在通过ItemsSource绑定数据。 I have a checkbox inside the listview. 我在列表视图中有一个复选框。 I am using Xamarin.Forms.InputKit. 我正在使用Xamarin.Forms.InputKit。 What I want is to access/get all checked row data via ViewModel. 我想要的是通过ViewModel访问/获取所有选中的行数据。 Data binding works well. 数据绑定效果很好。 I tried with CheckChangedCommand , but it is not triggering inside the ViewModel. 我尝试使用CheckChangedCommand ,但是它没有在ViewModel内部触发。

ListView.... 列表显示....

<ListView ItemsSource="{Binding LifeDemandList}" x:Name="lDemandView" HasUnevenRows="True">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout HeightRequest="44" IsVisible="True" BackgroundColor="White" Orientation="Vertical">

                    <Grid Padding="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                            <ColumnDefinition Width="40"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <StackLayout BackgroundColor="White" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" Grid.Column="0">
                            <Label HorizontalOptions="CenterAndExpand" FontFamily="{Binding quicksandsFont}" FontSize="14" FontAttributes="Bold" VerticalOptions="FillAndExpand" TextColor="Black" Text="{Binding DEMAND}"/>
                        </StackLayout>
                        <StackLayout BackgroundColor="White" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" Grid.Column="1">
                            <Label HorizontalOptions="CenterAndExpand" FontFamily="{Binding quicksandsFont}" FontSize="14" FontAttributes="Bold" VerticalOptions="FillAndExpand" TextColor="Black" Text="{Binding PREMIUM}"/>
                        </StackLayout>
                        <StackLayout BackgroundColor="White" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" Grid.Column="2">
                            <Label HorizontalOptions="CenterAndExpand" FontFamily="{Binding quicksandsFont}" FontSize="14" FontAttributes="Bold" VerticalOptions="FillAndExpand" TextColor="Black" Text="{Binding LATEFEE}"/>
                        </StackLayout>
                        <StackLayout BackgroundColor="White" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" Grid.Column="3">
                            <input:CheckBox  HorizontalOptions="CenterAndExpand" IsChecked="{Binding ROWCHECK}" Type="Check"/>
                        </StackLayout>
                    </Grid>

                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Sample data binding via ViewModel. 通过ViewModel进行示例数据绑定。

    List<LifeDemandData> lList = new List<LifeDemandData>();

    LifeDemandData ldd = new LifeDemandData();
    ldd.DEMAND = "2019/03";
    ldd.PREMIUM = "2,000.00";
    ldd.LATEFEE = "10.00";
    ldd.ROWCHECK = false;
    lList.Add(ldd);

    LifeDemandData ldd1 = new LifeDemandData();
    ldd1.DEMAND = "2019/04";
    ldd1.PREMIUM = "11,896.00";
    ldd1.LATEFEE = ".00";
    ldd1.ROWCHECK = false;
    lList.Add(ldd1);

    LifeDemandList = lList;

Solution: 解:

You can set the event CheckChanged of the checkbox and get all checked row data . 您可以设置复选框的事件CheckChanged并获取所有选中的行数据。

in xaml 在xaml中

<input:CheckBox  HorizontalOptions="CenterAndExpand" IsChecked="{Binding ROWCHECK , Mode=TwoWay}" Type="Check" CheckChanged="CheckBox_CheckChanged"/>

in code behind 在后面的代码中

For example I implement it in the contentPage 例如,我在contentPage中实现它

public partial class MainPage : ContentPage
{

    public ObservableCollection<LifeDemandData> LifeDemandList { get; set; }
    public ObservableCollection<LifeDemandData> selectedList;
    public MainPage()
    {
        InitializeComponent();

        BindingContext = this;



        LifeDemandList = new ObservableCollection<LifeDemandData>()
        {
           new LifeDemandData{ DEMAND = "2019/01" , LATEFEE = "22,000" , PREMIUM = "10.00" , ROWCHECK = false },
           new LifeDemandData{ DEMAND = "2019/02" , LATEFEE = "11,987" , PREMIUM = ".00" , ROWCHECK = false },
           new LifeDemandData{ DEMAND = "2019/03" , LATEFEE = "12,456" , PREMIUM = "6.00" , ROWCHECK = false },
           new LifeDemandData{ DEMAND = "2019/04" , LATEFEE = "78,159" , PREMIUM = "3.00" , ROWCHECK = false },

        };

        listview.ItemsSource = LifeDemandList;

    }

    private void CheckBox_CheckChanged(object sender, EventArgs e)
    {
        selectedList = new ObservableCollection<LifeDemandData>();

        for (int i=0;i< LifeDemandList.Count;i++)
        {
            LifeDemandData item = LifeDemandList[i];

            if(item.ROWCHECK)
            {
                selectedList.Add(item);
            }
        }

        DisplayAlert("Title", selectedList.Count + " item have been selected", "Cancel");

        // do something you want 

    }
}

Edit 编辑

If you want to implement it in ViewModel 如果要在ViewModel中实现

in xaml 在xaml中

<input:CheckBox  HorizontalOptions="CenterAndExpand" IsChecked="{Binding ROWCHECK , Mode=TwoWay}" Type="Check" CheckChangedCommand="{Binding CheckedCommand}" />

in model 在模型中

public class LifeDemandData
{
    public string DEMAND { get; set; }
    public string PREMIUM { get; set; }
    public string LATEFEE { get; set; }
    public bool ROWCHECK { get; set; }
    public ICommand CheckedCommand {  set; get; }

}

in ViewModel 在ViewModel中

 public class MyViewModel
{

    public ObservableCollection<LifeDemandData> LifeDemandList { get; set; }
    public ObservableCollection<LifeDemandData> selectedList;

    ICommand MyCommand;

    public MyViewModel()
    {

        MyCommand = new Command(() =>
        {


            selectedList = new ObservableCollection<LifeDemandData>();

            for (int i = 0; i < LifeDemandList.Count; i++)
            {
                LifeDemandData item = LifeDemandList[i];

                if (item.ROWCHECK)
                {
                    selectedList.Add(item);
                }
            }

           App.Current.MainPage.DisplayAlert("Title", selectedList.Count + " item have been selected", "Cancel");

        });

        LifeDemandList = new ObservableCollection<LifeDemandData>()
        {
           new LifeDemandData{ DEMAND = "2019/01" , LATEFEE = "22,000" , PREMIUM = "10.00" , ROWCHECK = false , CheckedCommand=MyCommand},
           new LifeDemandData{ DEMAND = "2019/02" , LATEFEE = "11,987" , PREMIUM = ".00" , ROWCHECK = false , CheckedCommand=MyCommand},
           new LifeDemandData{ DEMAND = "2019/03" , LATEFEE = "12,456" , PREMIUM = "6.00" , ROWCHECK = false , CheckedCommand=MyCommand},
           new LifeDemandData{ DEMAND = "2019/04" , LATEFEE = "78,159" , PREMIUM = "3.00" , ROWCHECK = false , CheckedCommand=MyCommand },

        };           

    }


}

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM