【问题标题】:Hub with dynamic HubSections with GridViews and DataBinding带有 GridView 和 DataBinding 的动态 HubSections 集线器
【发布时间】:2016-07-26 21:43:22
【问题描述】:

我想通过代码创建一个包含多个 HubSection 的 Hub。每个 HubSection 都拥有一个 GridView,因此看起来每个 HubSection 都是一个表格(全屏),我向左/向右滑动以查看每个表格。 在我的 XAML 页面中只有集线器,其他的东西应该由代码完成。 HubSections 应该在运行时创建。为此,我使用本地设置存储来保存有关此的一些信息,例如有多少 HubSection 等。 创建新的 HubSection 没问题,但我坚持为每个 HubSection 添加一个 GridView,因为我不明白这里的逻辑。看起来我必须添加一个 DataTemplate 和一个 GridView,但我的尝试都失败了。

注意:每个 GridView 也有它自己的来自可观察集合的数据绑定。

那么如何将带有数据绑定的 (?DataTemplate?) GridView 添加到 HubSection 中?

【问题讨论】:

    标签: c# xaml uwp windows-10-universal uwp-xaml


    【解决方案1】:

    使用 DataTemplate,您可以构建布局。我在一个项目中使用了以下模板来每天显示一些数据并为每天创建一个部分:

    <Page.Resources>
    <CollectionViewSource x:Name="HubViewModel"/>
    <DataTemplate x:Key="DataTemplate">
                <Grid Background="Transparent" Width="300" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,20">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <StackPanel Grid.Row="0" HorizontalAlignment="Center">
                        <TextBlock Text="{Binding SumShipmentsSA}" Style="{ThemeResource HeaderTextBlockStyle}" TextAlignment="Center" TextWrapping="NoWrap"/>
                    </StackPanel>
                    <StackPanel Grid.Row="1" HorizontalAlignment="Center">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Uid="SummaryHubNat" Text="National" FontSize="10" Width="100" VerticalAlignment="Center" Margin="0,0,20,0"/>
                            <TextBlock Text="{Binding CountShipmentsNationalSA}" Style="{ThemeResource BodyTextBlockStyle}" TextWrapping="NoWrap"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Uid="SummaryHubInt" Text="International" FontSize="10" Width="100" VerticalAlignment="Center" Margin="0,0,20,0"/>
                            <TextBlock Text="{Binding CountShipmentsInternationalSA}" Style="{ThemeResource BodyTextBlockStyle}" TextWrapping="NoWrap"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Uid="SummaryHubCharter" Text="Charter" FontSize="10" Width="100" VerticalAlignment="Center" Margin="0,0,20,0"/>
                            <TextBlock Text="{Binding CountShipmentsCharterSA}" Style="{ThemeResource BodyTextBlockStyle}" TextWrapping="NoWrap"/>
                        </StackPanel>
                    </StackPanel>
                </Grid>
            </DataTemplate>  
    </Page.Resources> 
    .
    .
    <Hub x:Name="MainHub" DataContext="{Binding Source={StaticResource HubViewModel}}" Margin="0,0,0,20"/>
    

    在代码页面中,我使用以下方法创建了部分:

     private void AddHubSection(IEnumerable<DaySummary> list)
            {
                if (list != null)
                {
                    list = list.OrderByDescending(x => x.Date);
                    foreach (var item in list)
                    {
                        if (item.Date.Date.Equals(DateTime.Now.Date))
                        {
                            continue;
                        }
    
                        HubSection hubSection = new HubSection();
                        TextBlock headerTextBlock = new TextBlock();
                        headerTextBlock.Text = item.Date.ToString("dddd dd.MMM");
                        headerTextBlock.FontSize = 15;
                        hubSection.Header = headerTextBlock;
                        hubSection.Margin = new Thickness(0);
    
                        object dataTemplate;
                        this.Resources.TryGetValue("DataTemplate", out dataTemplate);
                        hubSection.ContentTemplate = dataTemplate as DataTemplate;
                        hubSection.DataContext = item;
                        hubSection.DoubleTapped += HubSection_DoubleTapped;
                        MainHub.Sections.Add(hubSection);
                    }
                }
            }
    

    我认为该示例可以帮助您在尝试时获得乐趣。

    【讨论】:

    • 绑定有问题。我有一个List&lt;ObservableCollection&lt;MyViewModel&gt;&gt; 列表中的每个可观察集合是每个 HubSection 的数据。你的HubViewModel 是什么?
    • @Dude HubViewModel 是一个 CollectionViewSource(见 linkCollectionViewSource is a proxy for a CollectionView class, or a class derived from CollectionView. CollectionViewSource enables XAML code to set the commonly used CollectionView properties, passing these settings to the underlying view. CollectionViewSource has a View property that holds the actual view and a Source property that holds the source collection.
    • 在这种情况下是 IEnumerable&lt;DaySummary&gt; 并填充为 var list = await DaySummaryRepository.GetListAsync(); HubViewModel.Source = list;
    • 但是您的视图模型在哪里?通常我只是添加一个可观察的集合并添加一个 DataType(我的 ViewModel)
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2012-08-18
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多