2011-12-13 2 views
2

У меня есть класс в WCF:ListPicker и "SelectedItem всегда должен быть установлен на действительное значение"

[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 с IsolStorage, а затем загружу и применим в: 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; 
     } 

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

Ссылка на пример: 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(); 
    } 

Где осуществить это, ¿в классе WCF, в видовом?

При использовании XAML:

SelectedItem={Binding SelectedUser, Mode=TwoWay}" 

И в использовании видовую:

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; } 
    } 

Благодаря

+0

возможно дубликат [Listpicker ошибки SelectedItem всегда должен быть установлен на действительное значение] (http://stackoverflow.com/questions/7719682/listpicker-error-selecteditem -must-always-be-set-to-a-valid-value) –

ответ

6

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

Эта работа хорошо, но, как реализовать это в WCF? – Sulivan

0

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

+0

Как выбрать хранилище значений? Я добавил пример в megaupload: www.megaupload.com/?d=XDZSU3P0. – Sulivan

-1

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

By the way I found another question on this exact topic.

+0

Как я использую SelectedIndex с PropertyChanged TwoWay и MVVM? Если я использую MVVM, я не имею доступа к объекту listpicker для listpicker.SelectedIndex = _usuario.ID; ¿? – Sulivan

+0

Использование метода SelectedIndex является обходным путем, но вы также можете использовать SelectedItem. Просто переопределите методы equals. – derSteve

+0

Да, это то, что я в конечном итоге сделал для решения моей проблемы, я просто не удалял этот ответ. – Etch

Смежные вопросы