【问题标题】:Get selected item inside listview获取列表视图中的选定项目
【发布时间】:2016-08-04 04:08:45
【问题描述】:

我有一个带有标签的列表视图和一个使用taplate viewcell 创建的图像。在点击图像时,我想重定向到新页面,比如页面 B 并显示所点击项目的详细信息。

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using Xamarin.Forms;

namespace ____
{
    public class SelectMultipleBasePage<T> : ContentPage
    {
        public class WrappedSelection<T> : INotifyPropertyChanged
        {
            public T Item { get; set; }
            bool isSelected = false;
            public bool IsSelected
            {
                get
                {
                    return isSelected;
                }
                set
                {
                    if (isSelected != value)
                    {
                        isSelected = value;
                        PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
                        //                      PropertyChanged (this, new PropertyChangedEventArgs (nameof (IsSelected))); // C# 6
                    }
                }
            }
            public event PropertyChangedEventHandler PropertyChanged = delegate { };
        }
        public class BackGroundColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is bool)
                {
                    if ((bool)value)
                    {
                        return Color.FromHex("#DEE4EA");
                    }
                    else
                    {
                        return Color.White;
                    }
                }
                else
                {
                    return Color.White;
                }
            }

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }

        }

        public class WrappedItemSelectionTemplate : ViewCell
        {
            public WrappedItemSelectionTemplate()
                : base()
            {
                Grid objGrid = new Grid();

                objGrid.RowDefinitions.Add(new RowDefinition
                {
                    Height = new GridLength(1, GridUnitType.Star)
                });

                objGrid.ColumnDefinitions.Add(new ColumnDefinition
                {
                    Width = new GridLength(75, GridUnitType.Absolute),
                });
                objGrid.ColumnDefinitions.Add(new ColumnDefinition
                {
                    Width = new GridLength(1, GridUnitType.Star)
                });
                objGrid.ColumnDefinitions.Add(new ColumnDefinition
                {
                    Width = GridLength.Auto
                });

                //
                // Column 1:-
                Image objImage = new Image();
                objImage.SetBinding(Image.SourceProperty, new Binding("Item.Image"));
                objGrid.Children.Add(objImage, 0, 0);


                // Column 2:-
                StackLayout objStackLayoutCol2 = new StackLayout();
                objGrid.Children.Add(objStackLayoutCol2, 1, 0);

                Label name = new Label()
                {
                    Text = "Name",
                    Style = (Style)Application.Current.Resources["LabelStyle"],
                };
                Label date = new Label()
                {
                    Text = "Date",
                    Style = (Style)Application.Current.Resources["LabelStyleTiny"]
                };
                name.SetBinding(Label.TextProperty, new Binding("Item.Name"));
                date.SetBinding(Label.TextProperty, new Binding("Item.Date"));
                objStackLayoutCol2.Children.Add(name);
                objStackLayoutCol2.Children.Add(date);
                objStackLayoutCol2.Padding = new Thickness(10);


                Image objImageView = new Image();
                objImageView.GestureRecognizers.Add(new TapGestureRecognizer(OnTap));
                objImageView.Source = ImageSource.FromFile("Search.png");
                objGrid.Children.Add(objImageView, 2, 0);

                objGrid.SetBinding(Grid.BackgroundColorProperty, "IsSelected", converter: new BackGroundColorConverter());

                //
                // define context actions
                //
                var moreAction = new MenuItem { Text = "More" };

                moreAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
                moreAction.Clicked += (sender, e) =>
                {
                    var mi = ((MenuItem)sender);
                    //Debug.WriteLine("More Context Action clicked: " + mi.CommandParameter);
                };

                var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; // red background
                deleteAction.Icon = Device.OnPlatform("Icons/cancel.png", "cancel.png", "Images/cancel.png");
                deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
                deleteAction.Clicked += (sender, e) =>
                {
                    var mi = ((MenuItem)sender);
                    //Debug.WriteLine("Delete Context Action clicked: " + mi.CommandParameter);
                };

                //
                // add context actions to the cell
                //
                ContextActions.Add(moreAction);
                ContextActions.Add(deleteAction);
                //objGrid.Padding = new Thickness(10);

                StackLayout st = new StackLayout();
                st.Children.Add(objGrid);
                st.Children.Add(new BoxView() { Color = Color.FromHex("#A4B3C1"), WidthRequest = 100, HeightRequest = 1 });


                View = st;


            }

            public static void OnTap(View obj)
            {
               List<T> test= GetSelection();
                MessagingCenter.Send(new RedirectClass.OpenRecordingDetails(), RedirectClass.OpenRecordingDetails.Key);
            }
        }
        public static List<WrappedSelection<T>> WrappedItems = new List<WrappedSelection<T>>();
        public SelectMultipleBasePage(List<T> items)
        {
            WrappedItems = items.Select(item => new WrappedSelection<T>() { Item = item, IsSelected = false }).ToList();
            ListView mainList = new ListView()
            {
                ItemsSource = WrappedItems,
                ItemTemplate = new DataTemplate(typeof(WrappedItemSelectionTemplate)),
            };

            mainList.ItemSelected += (sender, e) =>
            {
                if (e.SelectedItem == null) return;
                var o = (WrappedSelection<T>)e.SelectedItem;
                o.IsSelected = !o.IsSelected;
                ((ListView)sender).SelectedItem = null; //de-select
            };
            Content = mainList;
            mainList.HasUnevenRows = true;


            if (Device.OS == TargetPlatform.WinPhone)
            {   // fix issue where rows are badly sized (as tall as the screen) on WinPhone8.1
                mainList.RowHeight = 40;
                // also need icons for Windows app bar (other platforms can just use text)
                ToolbarItems.Add(new ToolbarItem("All", "check.png", SelectAll, ToolbarItemOrder.Primary));
                ToolbarItems.Add(new ToolbarItem("None", "cancel.png", SelectNone, ToolbarItemOrder.Primary));
            }
            else
            {
               //  mainList.MinimumHeightRequest = 80;
               // mainList.RowHeight = 80;
                ToolbarItems.Add(new ToolbarItem("All", null, SelectAll, ToolbarItemOrder.Primary));
                ToolbarItems.Add(new ToolbarItem("None", null, SelectNone, ToolbarItemOrder.Primary));
            }
        }
        void SelectAll()
        {
            foreach (var wi in WrappedItems)
            {
                wi.IsSelected = true;
            }
        }
        void SelectNone()
        {
            foreach (var wi in WrappedItems)
            {
                wi.IsSelected = false;
            }
        }
        public static List<T> GetSelection()
        {
            return WrappedItems.Where(item => item.IsSelected).Select(wrappedItem => wrappedItem.Item).ToList();
        }
    }
}

我尝试添加一个 GestureRecognizers ontap,但如果单击列表视图而不是图像,getselection 会返回项目列表。

有什么帮助吗?

编辑

我也尝试添加类似这样的内容:

                Button aButton = new Button { Text = "TestButton" };
                aButton.SetBinding(Button.CommandParameterProperty, new Binding("Item.Name"));
                aButton.Command = new Command<Button>((Button theCellItem) =>
                {
                    var s = theCellItem.ToString();
                    //DisplayAlert("Tadaa", theCellItem.ToString(), "Ok");
                });

但它不起作用。出现错误:

System.InvalidCastException: Specified cast is not valid.

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    您可以通过将 isEnabled 属性设置为 false 来禁用列表视图选择。这将使列表视图无法点击,而 ViewCell 上的 GestureRecognizers 将按预期响应

    For Navigation this can be of help

    【讨论】:

    • 我有一个列表视图的多选功能。因此,每当用户单击列表项(外部图像视图按钮)时,多选功能都会起作用,但是当用户点击图像视图时,页面应该重定向。
    • 那么问题是什么?您可以将页面从图像选择事件主体推送到导航堆栈
    • 但是如果我禁用列表视图选择,那么我的多选功能将如何工作?我必须在哪里禁用列表视图?
    • 不,如果您希望多选工作,请不要禁用列表视图选择。简单地说,在图像点击事件上推送一个新页面。
    • 是的,我已经完成了。但我的头痛是将所选项目的 id 传递到新页面
    【解决方案2】:

    将 ListView 的 EventHandler 用于 ItemTapped 然后在代码隐藏中,您应该能够通过将对象参数从 ListView 转换为预期类型来访问该项目。

        private void MyListView_OnItemTapped(object sender, ItemTappedEventArgs e)
        {
            var person = sender as Person;
            Debug.WriteLine($"His name was {person.Name}");
        }
    

    【讨论】:

    • 这行不通。 sender 属于 ListView 类型,无法将其转换为 Person
    【解决方案3】:

    如果您使用包含控件的 ListView ItemTemplate,用户可以单击项目上的任意位置(这看起来更方便)。

    那么发送者就是你的 ListView 所以你可以试试这个:

    ListView listView   = sender as ListView;
    Person selectedItem = listView == null ? null : listView.SelectedItem as Person;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多