首页 > 解决方案 > 使用 System.Linq.IGrouping 时分配给 x:DataType 的内容

问题描述

好的,这应该很简单,但我被卡住了。

我正在升级一个旧的 .Net Xamarin 项目,我想做的一件事是将 x:DataType 标记添加到 XAML 文件中,以便它可以验证和自动完成所有绑定。例如

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:vm="clr-namespace:MyProject.PageModels.Info"
             xmlns:models="clr-namespace:MyProject.Models"
             x:DataType="vm:InfoViewModel"
             x:Class="MyProject.Pages.Info.InfoPage"
             Title="PageTitle">

到目前为止一切都很好,但是这个特定页面显示了一个分组的记录列表,定义为:

public List<IGrouping<string, LocalDocument>> GroupedDocs { get; set; }

现在编译器抱怨,因为我没有为 ListView.GroupHeaderTemplate 设置有效的 DataType (因为模板中的绑定在 ViewModel 中不存在)......而且我不知道分配给它什么,因为它似乎 x:DataType 不支持接口(更不用说接口+泛型了)。

    <ListView ItemsSource="{Binding GroupedDocs}" IsGroupingEnabled="true" 
                 Style="{StaticResource groupedList}" ItemTappedCommand="{Binding DocumentTappedCommand}">

        <ListView.GroupHeaderTemplate>
            <DataTemplate x:DataType="????"> <!-- <<<<< What to put here? -->
                <ViewCell Height="34">
                    <StackLayout Style="{StaticResource groupHeader}">
                        <Label Text="{Binding Key}"
                               Style="{StaticResource groupHeaderText}"/>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.GroupHeaderTemplate>

        <ListView.ItemTemplate>
            <DataTemplate x:DataType="models:LocalDocument">
                 <!-- (....) -->
            </DataTemplate>
        </ListView.ItemTemplate>

    </ListView>

我应该指定什么而不是 ???? 在前面的代码示例中?

作为一种解决方法,我创建了一个实现 <IGrouping<string, Document> 的 Dummy 类并将其分配为 x:DataType,但我并不觉得这是一个好的解决方案。而且,由于我确信许多其他项目将使用分组列表,我很想知道这种情况下的“最佳实践”是什么。

标签: c#xamlxamarin.net-standard-2.1

解决方案


您可以尝试创建自己的分组。

public class Grouping<K, T> : ObservableCollection<T>
{
    public K Key { get; private set; }

    public Grouping(K key, IEnumerable<T> items)
    {
        Key = key;
        foreach (var item in items)
            this.Items.Add(item);
    }
}

用法:

 public ObservableCollection<Grouping<string, LocalDocument>> GroupedDocs { get; set; }

从下面的链接下载源文件。https://github.com/jamesmontemagno/Xamarin.Forms-Monkeys


推荐阅读