我有一个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(它与ListPicker的SelectedItem绑定,具有TwoWay绑定模式)在Remove触发ItemsSource的CollectionChanged通知之前不会更新SelectedItem。
如何在不获取异常的情况下删除项目的任何想法?
答案 0 :(得分:1)
虽然根据您显示的代码我无法100%确定,但可能是因为“已选择”项目实际上并不是“条件”集合的成员。
因为您使用单独的对象来跟踪选择了哪个集合,所以您需要在集合中找到等效项并将其删除。 (您不能从首先不在集合中的集合中删除项目。即使它们在屏幕上以相同的方式表示。)
尝试这样的事情。
foreach(var item in conditions)
{
if(item.Equals(selectedCondition))
{
conditions.Remove(item);
}
}
(确保Equals
能够正确地确定集合中的正确实例。)
答案 1 :(得分:0)
public ObservableCollection<string> Conditions
{
get { return conditions; }
set { return contitions;
OnPropertyChanged("SelectedCondition");
}
}
public void ConfirmCondition()
{
if(SelectedCondition != null){
conditions.Remove(SelectedCondition );
}
}
工作? @Matt Lacey如果你添加项目,你删除项目,你不需要解析ObservableCollection。