DataBound Pivot控件未创建第一个PivotItem

时间:2010-11-06 18:50:56

标签: 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}"
      ItemTemplate="{StaticResource DisplayItemDataTemplate}">
</controls:Pivot >

使用此DataTemplate:

<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>

ItemsSourceObservableCollection。当页面显示时,它会创建所有PivotItems,但第一项不会被创建,除非我向前滚动并返回它。它在滚动列表中有一个条目,但没有PivotItem控件。

如果我在Pivot Control的LoadingPivotItem事件中设置了一个断点,则在第一次显示数据时不会调用它,但只有在我滚动并返回第一项时才会被点击。

是否有人看到Pivot控件的类似行为并有解决方法?或者我做错了什么?

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。

看来应该在构造函数中设置pivot的DataContext。我正在Page_Loaded事件中设置我的DataContext,第一个数据透视项不会触发Loading事件,如上所述。通过简单地绑定我的DataContext,事件就开始了。

我认为这是框架中的一个错误,但我还没有做足够的确认。

答案 1 :(得分:3)

我跑到这里,我无法通过在构造函数中设置数据上下文来解决这个问题,因为要显示的数据取决于来自NavigationService的信息,所以我不得不加载数据page_loaded-event处理程序。

但是通过在页面加载事件中将pivotIntrol的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 ");
        }
    }

答案 2 :(得分:1)

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

pivotTypes.SelectedItem = pivotTypes.Items[ 0 ];

答案 3 :(得分:0)

This blogpost解决了我的问题。

我对其他提供的解决方案的问题是我无法使用构造函数来设置DataContext,有时只有一个PivotItem,所以我可以来回切换加载内容。

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