【问题标题】:Listview does not contain a definition for selecteditemsListview 不包含选定项的定义
【发布时间】:2019-03-28 18:51:31
【问题描述】:

我正在使用 Xamarin.Forms。我想在单击“删除”按钮后删除列表视图中的选定项。

我的 xml

 <ListView x:Name="ProductsListView"
          HasUnevenRows="True"
          BackgroundColor="#ecf0f1"
          SeparatorVisibility="None"
          HorizontalOptions="FillAndExpand"
          VerticalOptions="FillAndExpand">

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout Margin="6,4,6,4"
                             BackgroundColor="White">
                                <StackLayout Orientation="Horizontal">
                                    <Label Text="Item ID" Margin="25,10,4,4" FontSize="Small" TextColor="Black"  />
                                    <Label Text="{Binding retail_modified_item_id}"  Margin="25,10,4,4" TextColor="Black" FontSize="12" />
                                </StackLayout>

                                <StackLayout Orientation="Horizontal">
                                    <Label Text="Name" Margin="25,2,8,4" TextColor="Black" FontSize="Small" />
                                    <Label Text="{Binding name}" Margin="32,1,8,4" TextColor="Black" FontSize="Small" />
                                    <Switch IsToggled="false"  Margin="210,2,2,2" Toggled="Switch_Toggled" />
                                </StackLayout>

                                <StackLayout Orientation="Horizontal">
                                    <Label Text="OldPrice"  Margin="25,2,8,4" TextColor="Black" FontSize="Small"/>
                                    <Label Text="{Binding old_price}" Margin="32,1,8,4" TextColor="Black" FontSize="Small" />
                                </StackLayout>

                                <StackLayout Orientation="Horizontal">
                                    <Label Text="NewPrice" Margin="25,2,8,4" TextColor="Black" FontSize="Small" />
                                    <Label Text="{Binding new_price}" Margin="32,1,8,4" TextColor="Black" FontSize="Small" />
                                </StackLayout>

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

我的cs代码

private void reject(object sender, EventArgs args)
    {
        foreach (var v in ProductsListView.SelectedItems)
        {
           ProductsListView.ItemSelected.Remove(v);
        }
        DisplayAlert("Rejected","Request Rejected!!", "OK");
    }

我收到此错误:

listview 不包含选定项 ItemSelected 的定义

【问题讨论】:

  • 如果您的问题已经完成,下面的答案,您可以标记为已完成我的答案。
  • 你能解释一下你到底想在这里做什么吗?
  • @G.hakim 我想在单击拒绝按钮后删除选定的数据。我在拒绝函数中附加了删除代码。但它抛出错误“列表视图不包含 selecteditem 的定义,ItemSelected”
  • 你能指出发生这种情况的代码行吗
  • foreach (在 ProductsListView.SelectedItems 中的变量 v) ProductsListView.ItemSelected.Remove(v); // selectedItem 和 itemSelected

标签: c# listview xamarin.forms


【解决方案1】:

您可以尝试将其转换为 ProductListView,

var selectedItems = (ListView/* or ProductListView*/)sender; //-> you need casting to access it.

您可以更改列表视图项目来源

public void reject(your_list_of_model_type your_list_of_model)
{
   your_list_of_model.RemoveRange(selectedItems);
   ProductListView.ItemSource = your_list_of_model;
}

解决方案 2:

这是你可以做的:

这是我的模型课:

public class Item  
{  
   public string ItemName { get; set; }  
   public string ItemDetails { get; set; }  
}  

在我的 XAML 中,或者您也可以在代码中编写它,绑定到您的项目模板的命令参数:

<Button Text="Delete" CommandParameter="{Binding ItemName}" Clicked="DeleteClicked"></Button>
Full Item Template will be like below :

<ListView.ItemTemplate>  
            <DataTemplate>  
               <ViewCell>  
                  <ViewCell.View>  
                     <StackLayout Orientation="Horizontal">  
                        <Label Text="{Binding ItemName}" HorizontalOptions="StartAndExpand" FontSize="30"></Label>  
                        <Button Text="Delete" CommandParameter="{Binding ItemName}" Clicked="DeleteClicked">        
                        </Button>  
                     </StackLayout>  
                  </ViewCell.View>  
               </ViewCell>  
            </DataTemplate>  
         </ListView.ItemTemplate>    

在你的代码文件中你可以这样做:

public void DeleteClicked(object sender, EventArgs e)  
{  
   var item = (Xamarin.Forms.Button)sender;  
   Item listitem = (from itm in allItems 
                    where itm.ItemName == item.CommandParameter.ToString() 
                    select itm)
                   .FirstOrDefault<Item>();  
   allItems.Remove(listitem);  
}  

重要提示:这只会从绑定集合中删除项目。要从原始列表中删除它,您需要使用ObservableCollection

【讨论】:

  • 你能解释一下我无法理解的这段代码吗?从这段代码中我怎样才能获得所有选定的值?
  • 找不到类型或命名空间名称“ProductsListView”(您是否缺少 using 指令或程序集引用?),事件“ListView.ItemSelected”只能出现在左侧+= 或 -= 我收到这 2 个错误
  • foreach 语句无法对“ListView”类型的变量进行操作,因为“ListView”不包含“GetEnumerator”的公共实例定义 - foreach(selectedItems 中的变量项)SELECTEDITEMS 中的错误.....事件“ListView.ItemSelected”只能出现在 += 或 -= ERROR IN ProductsListView.ItemSelected.Remove(item) 的左侧;实际上为什么这些错误会发生我犯了什么错误?
  • 再次更新了我的答案,您需要获取选定的项目并将它们删除您的源,您可以将更新的源提供给 ListView.ItemSource 它将发生变化。
  • private void reject(object sender, EventArgs args) // args 是 your_list_of_model 吗? your_list_of_model_type 和 your_list_of_model 是什么
【解决方案2】:

您可以将所有切换的项目添加到列表中,假设为selectedItems。当你点击REJECT按钮时,从listview的数据源中删除selectedItems

完整代码如下:

MainPage.xaml:

<StackLayout Orientation="Vertical">
        <!-- Place new controls here -->
        <Button Text="APPROVE" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
        <Button Text="REJECT" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand"
                Clicked="reject"/>
        <ListView x:Name="ProductsListView" 
          HasUnevenRows="True"
          BackgroundColor="#ecf0f1"
          SeparatorVisibility="None"
          HorizontalOptions="FillAndExpand"
          VerticalOptions="FillAndExpand">

            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Vertical" Margin="6,4,6,4"
                             BackgroundColor="White">

                            <StackLayout Orientation="Horizontal">
                                <Label Text="{Binding name}" Margin="32,1,8,4" TextColor="Black" FontSize="Small" />
                                <Switch IsToggled="false"  Margin="210,2,2,2" Toggled="Switch_Toggled" />
                            </StackLayout>

                            <StackLayout Orientation="Horizontal">
                                <Label Text="{Binding retail_modified_item_id}"  Margin="25,10,4,4" TextColor="Black" FontSize="12" />
                            </StackLayout>

                            <StackLayout Orientation="Horizontal">
                                <Label Text="OldPrice"  Margin="25,2,8,4" TextColor="Black" FontSize="Small"/>
                                <Label Text="{Binding old_price}" Margin="32,1,8,4" TextColor="Black" FontSize="Small" />
                            </StackLayout>

                            <StackLayout Orientation="Horizontal">
                                <Label Text="NewPrice" Margin="25,2,8,4" TextColor="Black" FontSize="Small" />
                                <Label Text="{Binding new_price}" Margin="32,1,8,4" TextColor="Black" FontSize="Small" />
                            </StackLayout>

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

MainPage.xaml.cs:

public partial class MainPage : ContentPage
    {
        ObservableCollection<ItemModel> allItems = new ObservableCollection<ItemModel>();
        List<ItemModel> selectedItems = new List<ItemModel>();

        public MainPage()
        {
            InitializeComponent();
            InitializeData();
            ProductsListView.ItemsSource = allItems;
        }

        private void reject(object sender, EventArgs e)
        {
            foreach (var v in selectedItems)
            {
                allItems.Remove(v);
            }
            DisplayAlert("Rejected", "Request Rejected!!", "OK");
        }

        private void Switch_Toggled(object sender, ToggledEventArgs e)
        {
            var switch1 = (Switch)sender;
            var item = (ItemModel)switch1.BindingContext;

            var isSelected = !item.selected;

            if (isSelected)
            {
                selectedItems.Add(item);
            }
            else
            {
                selectedItems.Remove(item);
            }
        }

        private void InitializeData() {
            allItems.Add(new ItemModel { name = "Onion Rings, Medium",
                retail_modified_item_id = 1000630,
                old_price = 1.29,
                new_price = 9.45,
                selected = false
            });

            allItems.Add(new ItemModel
            {
                name = "Hashbrowns",
                retail_modified_item_id = 1000739,
                old_price = 0.99,
                new_price = 8.5,
                selected = false
            });

            allItems.Add(new ItemModel
            {
                name = "Amstel Light, Single",
                retail_modified_item_id = 1002038,
                old_price = 3.5,
                new_price = 18,
                selected = false
            });

        }
    }

ItemModel.cs:

class ItemModel
    {
        public string name { get; set; }
        public int retail_modified_item_id { get; set; }
        public double old_price { get; set; }
        public double new_price { get; set; }
        public bool selected { get; set; }
    }

【讨论】:

  • 您必须刷新列表视图才能看到更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2014-10-21
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多