WP7 Listpicker没有显示所有项目

时间:2012-04-17 08:37:55

标签: windows-phone-7 silverlight-toolkit listpicker

我有一个项目需要将字符串列表绑定到listpicker控件。绑定完成后(在Loaded或OnNavigatedTo事件中),listpicker将打开以显示绑定项,但某些项随机丢失(在全屏模式下)。当listpicker开始关闭时,似乎出现了缺失的项目。不知道为什么会这样 - 是一个listpicker错误还是我绑定不正确?我正在使用2011年11月发布的silverlight工具包。

PS:使用少量商品(比如最多10件)时似乎没有问题

请使用以下代码重新创建问题

主页XAML                                                                 

        <TextBlock Text="Time of Day" Grid.Row="0" Margin="12,0,0,0" Style="{StaticResource PhoneTextNormalStyle}" />
        <toolkit:ListPicker x:Name="TimesOfDayList" Grid.Row="1" SelectionMode="Multiple" FullModeHeader="Time of Day"
                                    ExpansionMode="FullScreenOnly" ItemsSource="{Binding TimesOfDay}" 
                                    Margin="12,0,12,12">
            <toolkit:ListPicker.FullModeItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" Margin="24,0,0,0" Style="{StaticResource PhoneTextLargeStyle}" />
                </DataTemplate>
            </toolkit:ListPicker.FullModeItemTemplate>
        </toolkit:ListPicker>
    </Grid>

主页代码

private MainPageViewModel _viewModel;

    public MainPage()
    {
        InitializeComponent();
        Loaded += MainPage_Loaded;
        TimesOfDayList.SummaryForSelectedItemsDelegate = TimesOfDaySummary;
    }

    void MainPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        _viewModel = new MainPageViewModel();
        DataContext = _viewModel;
    }

    private string TimesOfDaySummary(IList items)
    {
        string itemNames = string.Empty;

        if (items != null && items.Count > 0)
        {
            var itemsList = items.Cast<string>().AsQueryable();
            foreach (var item in itemsList)
            {
                if (item != itemsList.Last())
                    itemNames += item + ", ";
                else
                    itemNames += item;
            }
        }

        return itemNames;
    }

Viewmodel类

public class MainPageViewModel : INotifyPropertyChanged
{
    public MainPageViewModel()
    {
        TimesOfDay = new List<string>
                          {
                              "12:00 AM",
                              "12:30 AM",
                              "01:00 AM",
                              "01:30 AM",
                              "02:00 AM",
                              "02:30 AM",
                              "03:00 AM",
                              "03:30 AM",
                              "04:00 AM",
                              "04:30 AM",
                              "05:00 AM",
                              "05:30 AM",
                              "06:00 AM",
                              "06:30 AM",
                              "07:00 AM",
                              "07:30 AM",
                              "08:00 AM",
                              "08:30 AM",
                              "09:00 AM",
                              "09:30 AM",
                              "10:00 AM",
                              "10:30 AM",
                              "11:00 AM",
                              "11:30 AM",
                              "12:00 PM",
                              "12:30 PM",
                              "01:00 PM",
                              "01:30 PM",
                              "02:00 PM",
                              "02:30 PM",
                              "03:00 PM",
                              "03:30 PM",
                              "04:00 PM",
                              "04:30 PM",
                              "05:00 PM",
                              "05:30 PM",
                              "06:00 PM",
                              "06:30 PM",
                              "07:00 PM",
                              "07:30 PM",
                              "08:00 PM",
                              "08:30 PM",
                              "09:00 PM",
                              "09:30 PM",
                              "10:00 PM",
                              "10:30 PM",
                              "11:00 PM",
                              "11:30 PM"
                          };
    }

    private List<string> _timesOfDay;
    public List<string> TimesOfDay
    {
        get { return _timesOfDay; }
        set
        {
            if(_timesOfDay != value)
            {
                _timesOfDay = value;
                OnPropertyChanged("TimesOfDay");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我复制了你的代码并得到了同样的问题。只需从

中删除Style="{StaticResource PhoneTextLargeStyle}"即可
<DataTemplate>
<TextBlock Text="{Binding}" Margin="24,0,0,0" />
</DataTemplate>

看起来它解决了这个问题。然而,这是一种奇怪的行为,其来源于Style属性。

我会尝试其他可能性,并会告诉您我是否会找到其他信息。

此致

答案 1 :(得分:1)

我已经向项目提交了补丁 http://www.codeplex.com/Download?ProjectName=silverlight&DownloadId=375366 描述如下:

导航到完整的选择器页面时会出现争用情况,其中旋转了RotationX属性的项目可能会在调用UpdateOutOfViewItems委托之前移出屏幕。

因此,某些项目可以保留为-90的RotationX。

我的解决方案是在创建动画时将视图中的项目列表传递给UpdateOutOfView项目,而不是在最终运行委托时收集可见项目。

http://www.codeplex.com/Download?ProjectName=silverlight&DownloadId=375366是修复错误所需的更新的ListPickerPage.xaml.cs文件。