Silverlight 数据绑定透视控件未创建第一个透视项

Silverlight 数据绑定透视控件未创建第一个透视项,silverlight,windows-phone-7,pivot,Silverlight,Windows Phone 7,Pivot,在Windows Phone 7页面中,我有以下控件: <controls:Pivot x:Name="Pivoter" Title="{Binding Name}" TitleTemplate="{StaticResource PivotTitleTemplate}" HeaderTemplate="{StaticResource PivotHeaderTemplate}" ItemsSource="{Binding Items}" I

在Windows Phone 7页面中,我有以下控件:

<controls:Pivot x:Name="Pivoter" Title="{Binding Name}" 
      TitleTemplate="{StaticResource PivotTitleTemplate}" 
      HeaderTemplate="{StaticResource PivotHeaderTemplate}"
      ItemsSource="{Binding Items}"
      ItemTemplate="{StaticResource DisplayItemDataTemplate}">
</controls:Pivot >

使用此数据模板:

<DataTemplate x:Key="DisplayItemDataTemplate">    
    <Image Grid.Column="0" Stretch="Uniform"
        Source="{Binding LargeImage, Converter={StaticResource UriBitmapConverter}}"/>
    <StackPanel Grid.Column="1" Orientation="Vertical">
        <HyperlinkButton NavigateUri="{Binding Uri}" Content="{Binding Uri}"/>
    </StackPanel>    
</DataTemplate>

ItemsSource
是一个
可观察的集合
。当页面显示时,它会创建所有的
数据透视项
,但除非我前后滚动到第一个项目,否则不会创建第一个项目。它在滚动列表中有一个条目,但没有
数据透视项
控件

如果我在Pivot控件的
LoadingPivotItem
事件中放置断点,则在第一次显示Pivot时不会调用该断点,但仅在我滚动到第一个项目时再次被命中


有没有人看到过类似的
Pivot
控件的行为,并找到了解决方法?还是我做错了什么?

我遇到了同样的问题

看起来应该在构造函数中设置透视的DataContext。我在Page_Loaded事件中设置了DataContext,第一个pivot项不会触发加载事件,如前所述。通过更早地绑定我的DataContext,事件开始触发


我相信这是框架中的一个bug,但我还没有做足够的工作来确认它。

我遇到了这个问题,我无法通过在构造函数中设置数据上下文来解决这个问题,因为要显示的数据取决于NavigationService的信息,所以我必须在page\u loaded-event处理程序中加载数据

但通过在页面加载事件中将pivot控件SelectedIndex设置为1,它神奇地开始工作。这不是一个理想的解决方案,但在这种情况下,它是一个拦截器,我只需要修复

示例代码:

void ChannelOverview_Loaded(object sender, RoutedEventArgs e)
    {
        string channelSystemName;
        if(this.NavigationContext.QueryString.TryGetValue("channelSystemName", out channelSystemName))
        {
            this.viewModel.LoadData(this.Dispatcher, channelSystemName);
            //Set the SelectedIndex to one,
            //otherwise the pivot-view won't render the first item.
            this.overviewPivot.SelectedIndex = 1;
        }
        else 
        {
            MessageBox.Show("Kanalen hade ett felaktigt Id ");
        }
    }
解决了我的问题

我与其他提供的解决方案的问题是,我无法使用构造函数来设置DataContext,有时,只有一个数据透视项,因此我可以来回切换以加载内容


解决方案非常简单:在更新集合之前,Pivot必须将其DataContext设置为null。然后更新集合,然后将DataContext设置为集合。

可能会有点晚,但可能会帮助某些人。如文件所述,如果数据上下文更改导致SelectedIndex再次为0,则数据透视的SelectedIndex不会更新第一个数据透视项,也不会调用数据透视项加载事件。然而,当我使用数据绑定的pivot控件时,下面的方法也起作用。请注意,pivotTypes.Items[0]返回数据绑定对象,而不是pivot项

pivotTypes.SelectedItem = pivotTypes.Items[ 0 ];

我在
this.overviewPivot.SelectedIndex=1之后直接添加了一行
this.overviewPivot.SelectedIndex=0
也可以解决此问题,而无需强制编写构造函数。我现在唯一的问题是数据透视项的数量为1时,因为这样我将无法切换到另一个数据透视项。使用绑定创建数据透视项时,不允许添加虚拟项。