ListPicker和"SelectedItem必须始终设置为有效值"

Sul*_*van 2 silverlight-toolkit windows-phone-7 listpicker

我在WCF中有一个类:

[DataContract]
public class Usuario
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Nombre { get; set; }

    [DataMember]
    public string Contraseña { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在WP7 Proyect中从WCF读取ObservableCollection并加载ListPicker:

lpUsuarios.ItemSource = listUsuarios;
Run Code Online (Sandbox Code Playgroud)

这项工作还可以.

现在,在WP7中使用"Usuario _usuario = new Usuario()"作为局部变量.

问题是,如果我使用IsolatedStorage保存变量_usuario然后加载并应用:lpUsuarios.SelectedItem = _usuario,则会导致错误:SelectedItem必须始终设置为有效值.

例:

Usuarios _usuario = new Usuario();

private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
     var settings = IsolatedStorageSettings.ApplicationSettings;
     _usuario = lpUsuarios.SelectedItem as Usuario;

     settings.Add("test", _usuario);
     settings.Save();
}
Run Code Online (Sandbox Code Playgroud)

现在,关闭应用程序,然后打开:

private void ButtonLoad_Click(object sender, RoutedEventArgs e)
{
     settings.TryGetValue<Usuario>("test", out _usuario);            
     lpUsuarios.SelectedItem = _usuario;  <--- ERROR SelectedItem must....
}
Run Code Online (Sandbox Code Playgroud)

在vs2010调试中,当打开应用程序并加载变量_usuario时,值是正确的,但不起作用.

错误:在ListPicker.cs中,SelectedItem必须始终设置为有效值

ListPicker.cs中的位置:

        // Synchronize SelectedIndex property
        if (!_updatingSelection)
        {
            _updatingSelection = true;
            SelectedIndex = newValueIndex;
            _updatingSelection = false;
        }
Run Code Online (Sandbox Code Playgroud)

¿任何解决方案?

链接示例:PhoneApp1.rar | 666.5 KB | www.megaupload.com/?d=XDZSU3P0

对不起我的英语不好.


如果我使用SelectedIndex,工作正常,谢谢Etch.

但现在,问题是如果我想使用:

    public override bool Equals(object obj)
    {
        return ID == (obj as Users).ID;
    }

    public override int GetHashCode()
    {
        throw new NotImplementedException();
    }
Run Code Online (Sandbox Code Playgroud)

在WLC类中,在ModelView中实现它?

在XAML中使用:

    SelectedItem={Binding SelectedUser, Mode=TwoWay}"
Run Code Online (Sandbox Code Playgroud)

在ModelView中使用:

    private Usuario selectedUser;
    public Usuario SelectedUser
    {
        get
        {
            return selectedUser;
        } //----------------if i use modelview, the error is produced here
        set
        {
            selectedUser= value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("SelectedUser"));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

WCF类:

   [DataContract]
   public class Usuario
   {
       [DataMember]
       public int ID { get; set; }

       [DataMember]
       public string Nombre { get; set; }

       [DataMember]
       public string Contraseña { get; set; }
   }
Run Code Online (Sandbox Code Playgroud)

谢谢

Ku6*_*opr 6

您的收藏集没有您要选择的项目.即使看起来一样,闻起来也一样,但它是一个不同的对象.您的Users类必须为此重写Equals方法:

    public class Users
    {
        public int ID { get; set; }
        public string Nombre { get; set; }

        public override bool Equals(object obj)
        {
            return ID == (obj as Users).ID;
        }

        public override int GetHashCode()
        {
            throw new NotImplementedException();
        }
    }
Run Code Online (Sandbox Code Playgroud)