2012-04-17 66 views
2

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

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

回答

1

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

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

看起来像它可以解决问题。然而,它是一个奇怪的行为,它的来源来自Style属性。

我会尝试其他的可能性,并会让你知道,如果我会发现一些其他的信息。

问候,

+1

删除样式并没有解决我的问题。你能重新检查它对你有用吗? – Girish 2012-04-17 11:06:20

+1

哎呀..突然它不起作用。让我看看这里发生了什么... – 2012-04-17 11:32:33

+1

嗨,再次。我花了一些时间试图弄清楚这里发生了什么,我真的很惊讶。没有办法解决它。我想这应该是一个错误,但不能相信目前没有人遇到这个问题。 – 2012-04-17 11:50:35

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文件。