wp8アプリでMVVMを使用してピボットコントロールが機能するようになりましたが、バインディングに関してはまだ機能していると考えられており、そのまま受け入れることができました。結果に満足しておらず、なぜこれが起こっているのかを理解しようとしています。私の DataContext である MainViewModel には、他の複数の ViewModel が含まれています。
シナリオ 1:
グリッド (レイアウト) で DataContext を定義し、ピボット ヘッダーの itemsSource を QuickSearchTabs ViewModel に割り当てると、これは正常に構築されますが、pivotitem 内で定義したリストボックスは割り当てられず、QuickSearchButtons ViewModel は割り当てられません構築されます。xaml コードは次のとおりです。
<Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{StaticResource MainViewModel}" >
<phone:Pivot x:Name="Pivot" ItemsSource="{Binding QuickSearchTabs}" FontSize="{StaticResource PhoneFontSizeSmall}" SelectedIndex="{Binding SelectedSearchTabIndex, Mode=TwoWay}">
<phone:Pivot.Title>
<TextBlock Text="My Search Options" />
</phone:Pivot.Title>
<phone:Pivot.HeaderTemplate>
<DataTemplate>
<ContentControl Content="{Binding Name}" />
</DataTemplate>
</phone:Pivot.HeaderTemplate>
<phone:Pivot.ItemTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding QuickSearchButtons}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Content="{Binding Name}" Grid.Row="0">
</Button>
<TextBlock Text="{Binding Description}" Grid.Row="1">
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataTemplate>
</phone:Pivot.ItemTemplate>
</phone:Pivot>
</Grid>
シナリオ 2:
グリッド (レイアウト) で DataContext を定義し、リストボックス タグ内で同じ DataContext を定義すると、ヘッダーとリストボックスが作成されますが、リストボックスの ItemsSource に割り当てられている viewModel が複数回呼び出されます。正確には、ピボットの数と同じ回数を呼び出します。xaml コードは次のとおりです。
<Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{StaticResource CriteriaViewModel}" >
<phone:Pivot x:Name="Pivot" ItemsSource="{Binding QuickSearchTabs}" SelectedIndex="{Binding SelectedSearchTabIndex, Mode=TwoWay}" >
<phone:Pivot.Title>
<TextBlock Text="My Search Options" />
</phone:Pivot.Title>
<phone:Pivot.HeaderTemplate>
<DataTemplate>
<ContentControl Content="{Binding Name}"/>
</DataTemplate>
</phone:Pivot.HeaderTemplate>
<phone:Pivot.ItemTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding QuickSearchButtons}" DataContext="{StaticResource CriteriaViewModel}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Content="{Binding Name}" Grid.Row="0">
</Button>
<TextBlock Text="{Binding Description}" Grid.Row="1">
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataTemplate>
</phone:Pivot.ItemTemplate>
</phone:Pivot>
</Grid>
前述のように、これは機能しますが、正しいデータが常に表示されるため、私には影響しません。
どういうわけか何が起こっているのかを見ることができますが、定義されたピボットヘッダーごとに ItemsSource が設定されるのはなぜですか。確かに、重要なのは目に見えるものだけです。
ピボットが私が使用している方法で使用されると想定されているかどうかはわかりません。これまで見てきたことから、通常は各 PivotItem にビューが割り当てられているようです。これは、私のソリューションが機能する方法ではありません。
特定の方法で物事をグループ化するために使用される多数のヘッダーが必要であり、それぞれの下に表示されるものはすべて動的に構築されますが、同じビュー、つまりボタンとラベルのリスト上にあります。
シナリオ 1) を機能させる方法と、シナリオ 2 で立ち往生している場合、ピボット ヘッダー アイテムの数に基づいてトリガーされないようにする方法についてのアイデアはありますか?
ありがとう。