2

私は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 では、WCF から ObservableCollection を読み取り、ListPicker を次のようにロードします。

lpUsuarios.ItemSource = listUsuarios;

これは大丈夫です。

さて、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();
}

次に、アプリケーションを閉じてから開きます。

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

vs2010 デバッグで、アプリケーションを開いて変数 _usuario をロードすると、値は正しいのに機能しません。

エラー: ListPicker.cs で、SelectedItem は常に有効な値に設定する必要があります

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

ModelView の WCF クラスで、それをどこに実装しますか?

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

3 に答える 3

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();
        }
    }
于 2011-12-14T08:29:14.973 に答える
0

ItemsSource にバインドされたコレクション内の項目の 1 つではない項目を選択することはできません。

于 2011-12-13T17:22:04.200 に答える
-1

先日、この問題に遭遇しました。正確な問題。Listpicker にバグがあります。私が家に持っている詳細へのリンクがありましたが、簡単な回避策は、あなたがしたことを行い、SelectedIndex代わりにプロパティを使用することです.

ところで、この正確なトピックに関する別の質問を見つけました。

于 2011-12-13T17:47:53.670 に答える