来自 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 后端拉取的,但我只想为每个部分使用我自己的自定义列表视图。但是,删除数据源和数据模板标头会给我带来错误。
非常感谢您提前提供的帮助!
--完全的新手
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}
,并且每个数据模板中ListView
的ItemsSource
被绑定到{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 属性,但这可能需要更多时间。如果需要,我可以详细说明,但简单的解决方案现在可能就足够了。