【问题标题】:Removing the selected item from a ListPicker从 ListPicker 中删除选定的项目
【发布时间】:2013-09-14 03:31:58
【问题描述】:

我有一个 Windows Phone 应用,其 ListPicker 绑定到 ObservableCollection 和一个选定项:

<toolkit:ListPicker Header="Endgame condition" ItemsSource="{Binding Conditions}" 
                    SelectedItem="{Binding SelectedCondition, Mode=TwoWay}" />

在 ViewModel 中:

public ObservableCollection<string> Conditions
{
    get { return conditions; }
}

public string SelectedCondition
{
    get { return selectedCondition; }
    set
    {
        if (selectedCondition != value)
        {
            selectedCondition = value;
            OnPropertyChanged("SelectedCondition");
        } 
    }
}

当我尝试从按钮处理程序的列表中删除所选项目时,我得到一个 InvalidOperationException(SelectedItem 必须始终设置为有效值):

public void ConfirmCondition()
{
    var selected = selectedCondition;
    SelectedCondition = null;

    // throws an exception: SelectedItem must always be set to a valid value
    conditions.Remove(selected);
}

我希望将 SelectedCondition 设置为 null(实际上是列表中的第一项)可以修复它,但事实并非如此。似乎 SelectedCondition 上的 NotifyPropertyChanged(以 TwoWay 绑定模式绑定到 ListPicker 的 SelectedItem)在 Remove 触发 ItemsSource 的 CollectionChanged 通知之前不会更新 SelectedItem。

有什么想法可以在不出现异常的情况下删除该项目吗?

【问题讨论】:

  • 你只在最后一句话中提到的Exception 是什么?
  • @Sheridan:我已经澄清了这个问题。这是一个 InvalidOperationException(参见代码中的注释)。

标签: c# windows-phone-8 listpicker


【解决方案1】:

虽然根据您显示的代码,我不能 100% 确定,但可能是因为“选定”项实际上不是“条件”集合的成员。

因为您使用单独的对象来跟踪选择了哪个集合,您需要在集合中找到等效项并将其删除。 (您不能从一开始就不在该集合中的集合中删除一个项目。即使它们在屏幕上以相同的方式表示。)

试试这样的。

foreach(var item in conditions)
{
    if(item.Equals(selectedCondition))
    {
        conditions.Remove(item);
    }
}

(确保Equals 能够正确确定集合中的正确实例。)

【讨论】:

  • 据我从调用堆栈中得知,问题是当我从集合中删除项目时,它仍然是 ListPicker 中的 SelectedItem,并且在从集合调用 ListPicker 的 SelectItem 设置器(因为基础集合已更改)。首先尝试取消选择它似乎没有任何效果。
  • 问题原来是我将null 作为列表中的一个项目并尝试将其设置为所选项目不起作用。我用占位符字符串“请选择...”替换它,效果很好。
【解决方案2】:
public ObservableCollection<string> Conditions
{
    get { return conditions; }
    set { return contitions;
    OnPropertyChanged("SelectedCondition");
    }
}

public void ConfirmCondition()
{
    if(SelectedCondition != null){
    conditions.Remove(SelectedCondition );
    }
}

工作? @Matt Lacey 如果您像删除项目一样添加项目,则无需解析 ObservableCollection。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2015-03-22
    • 2021-09-30
    • 1970-01-01
    • 2014-02-11
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多