在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>
ItemsSource
是ObservableCollection
。当页面显示时,它会创建所有PivotItems
,但第一项不会被创建,除非我向前滚动并返回它。它在滚动列表中有一个条目,但没有PivotItem
控件。
如果我在Pivot Control的LoadingPivotItem
事件中设置了一个断点,则在第一次显示数据时不会调用它,但只有在我滚动并返回第一项时才会被点击。
是否有人看到Pivot
控件的类似行为并有解决方法?或者我做错了什么?
答案 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设置为集合。