Listpicker错误SelectedItem必须始终设置为有效值

我在Windows Phone 7应用程序中有一个页面,用户可以在其中编辑或删除Transaction对象。 Transaction对象是一个Linq-to-Sql类,它与Account类和Category类有关系。 在页面中,我使用ListPicker让用户选择给定事务的帐户和类别,如下所示:

  

ListPicker_Tap事件是针对Windows Phone的WPF Toolkit的Aug / 2011版本中的错误的修复,简单地说:

  private void ListPicker_Tap(object sender, System.Windows.Input.GestureEventArgs e) { ListPicker lp = (ListPicker)sender; lp.Open(); } 

如果用户编辑事务,一切都很好,但如果用户尝试删除它,我会收到一条错误消息,说“SelectedItem必须始终设置为有效值”。

如果用户单击TransactionPage.xaml.cs中appbar中的delete按钮,则代码如下:

  private void appBarDelete_Click(object sender, EventArgs e) { MessageBoxResult result = MessageBox.Show("Are you sure?\n", "Confirm", MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { App.ViewModel.DeleteTransaction(transaction); } NavigationService.GoBack(); } 

我的ViewModel.DeleteTransaction方法:

  public void DeleteTransaction(Transaction transaction) { AllTransactions.Remove(transaction); transactionRepository.Delete(transaction); } 

我的transactionRepository.Delete方法:

  public void Delete(Transaction transaction) { Context.Transactions.DeleteOnSubmit(transaction); Context.SubmitChanges(); } 

我在Context.SubmitChanges()执行中收到错误,调试指向Transaction类中的NotifyPropertyChanged,我得到错误的行是这样的:

  protected virtual void SendPropertyChanged(String propertyName) { if ((this.PropertyChanged != null)) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 

在propertyName属性中,值为“Category”。 看起来当删除对象时发送类别和帐户的propertychanged事件,并且因为listpicker处于TwoWay模式,所以在处理它时遇到一些麻烦。 我该怎么办呢? 我需要一些帮助。

问题是ListPicker期望SelectedItemListPickerItem而您将它绑定到Transaction类型的对象。 您可以通过绑定到SelectedIndex属性来解决问题,然后根据索引从ViewModel中选择适当的对象。

此外,如果您定义Tap处理程序的原因是由于ListPicker放置在ScrollViewer时未打开的错误,请查看修补程序ID 10247 。 如果您使用该补丁重新编译工具包,则可以解决问题。

此错误也可能是由XAML属性的顺序引起的:

这不起作用(抛出exception,因为在设置SelectedItem时ItemsSource为null):

  

这有效,因为itemssource首先被初始化:

  

ListPicker使用Items.IndexOf来获取它应该选择的项实例的索引。

如果实例不匹配(它不是集合中的对象实例),IndexOf将返回-1并抛出InvalidOperationException并显示消息:“SelectedItem必须始终设置为有效值”。

覆盖集合中项目类型的等于方法,它将按预期工作。

例:

 public override bool Equals(object obj) { var target = obj as ThisType; if (target == null) return false; if (this.ID == target.ID) return true; return false; } 

希望能帮助到你

只有两个检查会在SelectedItem上抛出InvalidOperationException

  1. Listpicker Items为null(声明:属性顺序很重要。如果selecteditem必须出现在itemsource之后(Programatic:确保itemsource已加载)
  2. Listpicker在项目上应用Indexof来设置所选项目。 因此,请确保在必要时覆盖等于。

使用watchpicker.Items上的watch进行调试并重写Equals方法将帮助我们识别问题