【问题标题】:WP8 LongListMultiSelector Can't Remove Selected ItemsWP8 LongListMultiSelector 无法删除所选项目
【发布时间】:2013-12-12 15:43:10
【问题描述】:

我有一个绑定到 ObservableCollection 的 LongListMultiSelector。当我选择列表中的所有项目并尝试删除时,它开始失败并在 35 次成功删除后返回 false。


        int failed = 0;
        while ((App.ViewModel.Queue.Count - failed)> 0)
        {
            //get playlist viewmodel
            bool success = App.ViewModel.Queue.Remove((ItemViewModel)QueueList.SelectedItems[0]);
            if (!success)
                failed++;
            System.Diagnostics.Debug.WriteLine("DELETING " + success);    
        }

如果我不包括对失败项目的检查,它会陷入无限循环。任务完成后,将删除 300 个项目中的 35 个。如果我重新运行任务,另外 35 个项目将被删除,其余的则失败......

我的 Observable 集合是这样定义的

      public ObservableCollection<ItemViewModel> Queue { get; set; }
      this.Queue = new ObservableCollection<ItemViewModel>();

在我的 xaml 中,MultiSelector 是这样定义的

      <toolkit:LongListMultiSelector
                x:Name="QueueList" 
                Margin="0,0,-12,0" 
                ItemsSource="{Binding Queue}"
                LayoutMode="List"
                SelectionChanged="QueueList_SelectionChanged">

如何填充队列(从一个列表中选择的项目被复制到队列中

        foreach (ItemViewModel item in OriginalList.SelectedItems)
        {
            Boolean isQueued = false;
            foreach (ItemViewModel queueItem in App.ViewModel.Queue)
            {
                if (queueItem.Equals(item))
                {
                    isQueued = true;
                    break;
                }
            }
            ItemViewModel newItem = new ItemViewModel();
            newItem = item;

            if (!isQueued)
            {
                App.ViewModel.Queue.Add(newItem);
                for (int i = 0; i < ApplicationBar.MenuItems.Count; i++)
                {

                    ApplicationBarMenuItem menuItem = (ApplicationBarMenuItem)ApplicationBar.MenuItems[i];
                    if (menuItem.Text.Equals("clear queue") && !menuItem.IsEnabled)
                        menuItem.IsEnabled = true;
                }
            }
        }
        OriginalList.SelectedItems.Clear();
        DataSerializer.SaveQueue();
    }

【问题讨论】:

    标签: c# windows-phone-8 observablecollection


    【解决方案1】:

    迭代SelectedItems 的数组并逐个删除项目。示例:

    public void delete()
    {
        while (Queue.SelectedItems.Count > 0)
            {
                Queue.ItemsSource.Remove(Queue.SelectedItems[0]);
            }
    }
    

    【讨论】:

    • 不,我没有存储 IsSelected 属性。我能够访问 SelectedItems 的唯一方法是通过 Queue.SelectedItems[]
    • 更改了答案 - 请检查它是否适用
    • 也 - 从 Codeplex Toolkit 站点检查这个示例,我从中改编了 sn-p:phone.codeplex.com/SourceControl/latest#PhoneToolkitSample8/…
    • 它运行,但陷入无限循环。我假设一个或多个项目没有被删除。这似乎与我原来的帖子的行为相同。
    • 请用您如何填充此集合来更新您的问题。
    【解决方案2】:

    您还可以使用 Clear 方法,该方法将遍历数组并取消选择所选项目。

     private void Cancel_Selected(object sender, System.Windows.Input.GestureEventArgs e)
        {
            Queue.SelectedItems.Clear();       
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2013-01-03
      • 2013-08-18
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多