1

次の問題があります。Windows Phone 7 アプリケーションを作成していて、ObservableCollection の人々にバインドされている ListBox を使用しています。これの実装を以下に示します。

public class Person
{
    private string _id { get; set; }
    private string _name { get; set; }


    public Person(string Id, string Name, string Title)
    {
        _id = Id;
        _name = Name;
    }

    public string Id
    {

        get { return _id; }

        set
        {

            _id = value;

            FirePropertyChangedEvent("Id");

        }
    }

    public string Name
    {

        get { return _name; }

        set
        {

            _name = value;

            FirePropertyChangedEvent("Name");

        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void FirePropertyChangedEvent(string propertyName)
    {

        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

    }

}

people Collection は Person オブジェクトで満たされています。それらは次の関数で作成されます... listValues は私の ListBox です。

void svc_GetHierachyCompleted(object sender, HCMobileSvc.GetHierachyCompletedEventArgs e)
    {
        var data = e.Result.ToArray();
        listValues.ItemsSource = null;
        people.Clear();

        int i = 0;
        foreach(var item in data)
        {
            if (i == 0)
            {
                // Manager
                mgrField1.Text = item[1].ToString();
                mgrField2.Text = item[2].ToString();
                i++;
            }
            else
            {
                // Untergebenen hinzufügen
                people.Add(new Person(item[0].ToString(), item[1].ToString(), item[2].ToString()));
            }

        }

        // Update List
        listValues.ItemsSource = people;

    }

これで、プロパティ Id と Name の両方にバインドされた 2 つのテキストブロックを持つ DataTemplate ができました。SelectionChanged イベントが発生すると、次のコードを使用してリスト全体を再構築しようとします (そのため、上記の関数を再度呼び出します)。

            string id = people[listValues.SelectedIndex].Id;
        MessageBox.Show(id);
        CreateHierachy(id);

CreateHierachy は WebService をクエリするだけで、それが上記のメソッドに入ります。問題は、ListBox で値を選択するとすぐに次のエラーが表示されることです。

ArgumentOutOfRangeException {"\r\nParameter name: index"}

エラーは、行 listValues.SelectedIndex によって発生します。なぜそれが起こるのか、私にはまったくわかりません。私が知っているのは、MessageBox が正しい SelectedIndex 値を示しているということです。また、行 people.Clear() を削除すると、エラーは消えますが、ListBox は更新されません。

問題が発生している可能性のあるアイデアはありますか?

ありがとう!!!

さようなら、ワールドシグニア

4

1 に答える 1

0

ここでSelectedIndex>=0であることを確認する必要があります:

if (listValues.SelectedIndex >= 0)
     string id = people[listValues.SelectedIndex].Id;
于 2011-06-28T09:01:11.107 に答える