来自 HubAppSection 内部的自定义列表视图 -- Windows Phone 8.1

本文关键字:Windows Phone 视图 列表 HubAppSection 内部 自定义 来自 | 更新日期: 2023-09-27 18:28:42

我目前正在构建一个基于HubAppTemplate的Windows Phone Applicaation。该模板附带一个示例。用于填充每个中心部分数据的 JSON 数据源。但是,我想使用非 JSON 类型的数据作为代码的基础。在我的 C# 代码中,我需要对后端进行函数调用,以便从中获取我想要的数据类型。

我可以将此数据放在我自己的自定义列表中(在 C# 端(,但如何使该列表充当我的 HubSection 的数据源?任何旧的列表视图/列表框都可以完美运行。基本上,我需要帮助将 C# 连接到 XAML——主要问题是我无法按名称访问数据模板中的 listView。

谁能给我一些指示,让我朝着正确的方向前进?

这里有一些参考代码来向您展示我在说什么:

<HubSection x:Uid="Clubs" Header="Clubs" DataContext="{Binding Groups}" HeaderTemplate="{ThemeResource HubSectionHeaderTemplate}">
            <DataTemplate>
                <ListView Name="ClubsList"
                    IsItemClickEnabled="True"
                    ItemsSource="{Binding}"
                    ItemClick="GroupSection_ItemClick"
                    ContinuumNavigationTransitionInfo.ExitElementContainer="True">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Margin="0,0,0,27.5">
                                <TextBlock Text="{Binding Title}" Style="{ThemeResource ListViewItemTextBlockStyle}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </HubSection>

上面的 XAML 基本上是直接从中心应用模板中提取的。我希望能够在从我的 C# 代码生成的 ListView 中使用我自己的 itemssource - 但是,我无法弄清楚这个 ItemsSource 是如何工作的。我也无法按名称访问我的列表视图(俱乐部列表(。

这是顶部的初始化代码(不确定发布此内容是否重要(:

<Page
x:Class="HubAppTemplate.HubPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HubAppTemplate"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="using:HubAppTemplate.Data"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
d:DataContext="{Binding Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:SampleDataSource}}"
mc:Ignorable="d"> 
<Page.Resources>
    <DataTemplate x:Key="HubSectionHeaderTemplate">
        <TextBlock Margin="0,0,0,-9.5" Text="{Binding}"/>
    </DataTemplate>
    <!-- Grid-appropriate item template as seen in section 2 -->
    <DataTemplate x:Key="Standard200x180TileItemTemplate">
        <Grid Margin="0,0,9.5,9.5" Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}">
            <Image Source="{Binding ImagePath}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}" Height="138.5" Width="138.5"/>
            <TextBlock Text="{Binding Title}" VerticalAlignment="Bottom" Margin="9.5,0,0,6.5" Style="{ThemeResource BaseTextBlockStyle}"/>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="StandardTripleLineItemTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Border Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,9.5,0,0" Grid.Column="0" HorizontalAlignment="Left">
                <Image Source="{Binding ImagePath}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}" Height="79" Width="79"/>
            </Border>
            <StackPanel Grid.Column="1" Margin="14.5,0,0,0">
                <TextBlock Text="{Binding Title}" Style="{ThemeResource ListViewItemTextBlockStyle}"/>
                <TextBlock Text="{Binding Description}" Style="{ThemeResource ListViewItemContentTextBlockStyle}" Foreground="{ThemeResource PhoneMidBrush}" />
                <TextBlock Text="{Binding Subtitle}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
            </StackPanel>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="StandardDoubleLineItemTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Border Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,9.5,0,0" Grid.Column="0" HorizontalAlignment="Left">
                <Image Source="{Binding ImagePath}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}" Height="79" Width="79"/>
            </Border>
            <StackPanel Grid.Column="1" Margin="14.5,0,0,0">
                <TextBlock Text="{Binding Title}" Style="{ThemeResource ListViewItemTextBlockStyle}"/>
                <TextBlock Text="{Binding Subtitle}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}"/>
            </StackPanel>
        </Grid>
    </DataTemplate>
</Page.Resources>
<Grid x:Name="LayoutRoot">
    <Hub x:Name="Hub" x:Uid="Hub" Header="Club Alert" Background="{ThemeResource HubBackgroundImageBrush}">

它是从 JSON 后端拉取的,但我只想为每个部分使用我自己的自定义列表视图。但是,删除数据源和数据模板标头会给我带来错误。

非常感谢您提前提供的帮助!

-

-完全的新手

来自 HubAppSection 内部的自定义列表视图 -- Windows Phone 8.1

HubSection元素

需要通过模板填充其内容,因此不幸的是,您不能只删除<DataTemplate>标签。但是,如果我理解正确的话,有一种简单的方法可以完成您要做的事情。

如果从默认的中心模板开始,则应在 HubPage.xaml.cs 文件中具有此功能

private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
        {
            // TODO: Create an appropriate data model for your problem domain to replace the sample data
            var sampleDataGroups = await SampleDataSource.GetGroupsAsync();
            this.DefaultViewModel["Groups"] = sampleDataGroups;
            MainViewModel viewModel = DataContext as MainViewModel;
            if (!viewModel.IsDataLoaded)
            {
                viewModel.Load();
            }
        }

this.DefaultViewModel只是一个字典,他们将示例 JSON 加载到变量中,并将其存储在字典的 ["Groups"] 键中。由于页面的DataContext被绑定到{Binding DefaultViewModel, RelativeSource={RelativeSource Self}},HubSection的数据上下文被绑定到{Binding Groups},并且每个数据模板中ListViewItemsSource被绑定到{Binding},加载的JSON的每个元素都被用来填充ListView的项目。

一个简单的解决方案是将this.DefaultViewModel["Groups"]分配给从后端加载的数据创建的 C# 列表。

像这样:

private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
            {
                // TODO: Create an appropriate data model for your problem domain to replace the sample data
                var myData = await GetListOfThingsFromBackend();
                this.DefaultViewModel["Groups"] = myData;
                MainViewModel viewModel = DataContext as MainViewModel;
                if (!viewModel.IsDataLoaded)
                {
                    viewModel.Load();
                }
            }

更好的方法可能是将所有 ViewModel 功能分离到更适合你需求的自己的类中,然后在整个 XAML 中调整各种 DataContext 属性,但这可能需要更多时间。如果需要,我可以详细说明,但简单的解决方案现在可能就足够了。