ListPicker и «SelectedItem всегда должен быть установлен в допустимое значение» - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть класс в WCF:

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

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

    [DataMember]
    public string Contraseña { get; set; }
}

В WP7 Proyect прочитайте ObservableCollection из WCF и загрузите ListPicker с помощью:

lpUsuarios.ItemSource = listUsuarios;

Это нормально работает.

Теперь в WP7 используйте «Usuario _usuario = new Usuario ()» для локальной переменной.

Проблема в том, что если я сохраню переменную _usuario с помощью IsolatedStorage, а затем загрузлю и подам в: 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();
}

Теперь закройте приложение и затем откройте:

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

ВОтладка vs2010, при открытии приложения и загрузке переменной _usuario, значение верное, но не работает.

Ошибка в: Для SelectedItem всегда должно быть установлено допустимое значение в ListPicker.cs

Расположение в ListPicker.cs:

        // Synchronize SelectedIndex property
        if (!_updatingSelection)
        {
            _updatingSelection = true;
            SelectedIndex = newValueIndex;
            _updatingSelection = false;
        }

Любое решение?


Если я использую SelectedIndex, работать нормально, спасибо Etch.

Но теперь проблема заключается в том, если я хочу использовать:

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

    public override int GetHashCode()
    {
        throw new NotImplementedException();
    }

Где реализовать это, ¿в WКласс CF, в ModelView?

В XAML используется:

    SelectedItem={Binding SelectedUser, Mode=TwoWay}"

А в 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"));
            }
        }
    }

Класс WCF:

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

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

       [DataMember]
       public string Contraseña { get; set; }
   }

Ответы [ 3 ]

6 голосов
/ 14 декабря 2011

В вашей коллекции нет элемента, который вы хотите выбрать.Даже если выглядит одинаково, пахнет одинаково, но это другой объект.Ваш класс 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();
        }
    }
0 голосов
/ 13 декабря 2011

Я столкнулся с этой проблемой только на днях. Точная проблема. В Listpicker есть ошибка. У меня дома была ссылка, в которой подробно рассказывается о ней, но простой способ обойти это сделать то, что вы сделали, и вместо этого использовать свойство SelectedIndex.

Кстати, я нашел еще один вопрос на эту тему.

0 голосов
/ 13 декабря 2011

Вы не можете выбрать элемент, который не является одним из элементов в коллекции, связанных с ItemsSource.

...