ListPicker SelectedItem引发InvalidOperationException异常

时间:2013-11-30 10:35:55

标签: c# windows-phone-8

我有这样的XAML代码:

<toolkit:ListPicker x:Name="lstStatus" SelectionMode="Single" ItemTemplate="{StaticResource ListPickerItemTemplate}" FullModeItemTemplate="{StaticResource ListPickerFullModeItemTemplate}" FullModeHeader="Items" CacheMode="BitmapCache"/>

<phone:PhoneApplicationPage.Resources>
    <DataTemplate x:Name="ListPickerItemTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name}" Margin="10 0 0 0"/>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Name="ListPickerFullModeItemTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name}" Margin="10 0 0 0"/>
        </StackPanel>
    </DataTemplate>
</phone:PhoneApplicationPage.Resources>

我使用以下方法填充项目来源:

public List<Items> PopulatelstStatus()
{
    List<Items> source = new List<Items>();
    source.Add(new Items() { Name = "Booked" });
    source.Add(new Items() { Name = "Confirmed" });
    source.Add(new Items() { Name = "Completed" });
    source.Add(new Items() { Name = "Cancelled" });
    return source;
}

lstStatus.ItemsSource = PopulatelstStatus();

问题是,当我想设置此ListPicker的SelectedItem属性时,它会引发InvalidOperationException。我尝试了以下内容。

var item = PopulatelstStatus().SingleOrDefault(n => n.Name == equipBooking.Status.Description);

lstStatus.SelectedItem = item;

var item = PopulatelstStatus().SingleOrDefault(n => n.Name == equipBooking.Status.Description);

lstStatus.SelectedIndex = PopulatelstStatus().IndexOf(item);

1 个答案:

答案 0 :(得分:1)

设置SelectedItem时,需要使用ItemsSource包含的项目进行设置。每次调用PopulatelstStatus方法时,它都会生成一个新的项集合。这个新的项目集合与您设置为ListPicker的ItemsSource的集合不同。

看起来你喜欢的是静态的。您应该缓存列表并使用它。

private List<Items> _source;
public List<Items> PopulatelstStatus()
{
    if(_source == null)
    {
        _source = new List<Items>();
        _source.Add(new Items() { Name = "Booked" });
        _source.Add(new Items() { Name = "Confirmed" });
        _source.Add(new Items() { Name = "Completed" });
        _source.Add(new Items() { Name = "Cancelled" });
    }
    return _source;
}

现在,当您致电PopulatelstStatus时,它将始终是同一个集合,当您从中获取项目时,它将与ListPicker中包含的项目相同。