xaml - 在带有 MVVM 的 Windows Phone 8 上使用 Pivot 控件进行投标

标签 xaml data-binding mvvm viewmodel model-binding

我终于让我的枢轴控制在 wp8 应用程序中使用 MVVM 工作,但我仍然有一个关于绑定(bind)的问题,因为它的工作原理,我可以接受它,我对结果不满意,我试图理解为什么会这样。我的 DataContext MainViewModel 包含多个其他 ViewModel。

场景一:

如果我在网格(布局)中定义 DataContext,并将数据透视表头的 itemsSource 分配给 QuickSearchTabs ViewModel 并且可以构建,但是我在 pivotitem 中定义的列表框没有分配给 QuickSearchButtons ViewModel 没有得到 build 。这是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>

场景二:

如果我在网格(布局)中定义 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。当然,唯一重要的是出现在可见性中的那个!

我不知道是否应该按照我使用它们的方式使用 Pivots。看来,从我目前所见,通常一个 View 被分配给每个 PivotItem。这不是我希望我的解决方案起作用的方式!

我只想要大量用于以特定方式对事物进行分组的标题,并且每个标题下显示的内容都是动态构建的,但在同一 View 上,即按钮和标签列表。

关于如何让场景 1) 工作的任何想法,如果我被场景 2 困住,如何根据数据透视表头项目的数量阻止它被触发?

谢谢。

最佳答案

问题解决了!

QuickSearchTabs 是 QuickSearchTab 的可观察集合,而它本应是 ViewModel 的可观察集合,即 QuickSearchTabViewModel,并且在此 viewModel 中,它将为每个选项卡加载相关 QuickSearchButtons 的可观察集合。

拥有 QuickSearchTabViewModel 提供了更大的灵 active ,它将允许访问当前选项卡(标题)和其他相关属性,包括在每个选项卡中维护的所有内容,例如按钮。

希望这可以帮助。

关于xaml - 在带有 MVVM 的 Windows Phone 8 上使用 Pivot 控件进行投标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15713691/

相关文章:

时间:2019-03-08 标签:c#datagridviewredcross

silverlight - 如何为绑定(bind)到 viewmodel 属性的 silverlight 文本 block 提供设计时间值?

c# - 如何从 View 模型(WPF、MVVM)更改文本框的可见属性

wpf - 边框宽度显示不一致

c# - 如何更正此说明 WPF DependencyProperty 用法的示例?

Windows 8 商店应用程序 : Using multiple RichTextColumns in a flipview control

c# - 无法使 DataGridView 多次绑定(bind)到数据源

javascript - KnockoutJS/Bootstrap - 使用 javascript 关闭模态时清除模态形式

c# - WPF ListView 大数据时性能很差

c# - UWP:用户控件 ListView DataTemplate 数据类型绑定(bind)