使用 System.Linq.IGrouping 时分配给 x:DataType 的内容
What to assign to an x:DataType when using System.Linq.IGrouping
好的,这应该很简单,但我卡住了。
我正在升级一个旧的 .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 设置有效的数据类型(因为模板中的绑定在 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>
我应该指定什么而不是 ????在前面的代码示例中?
作为变通方法,我创建了一个实现 的 Dummy class 并将其指定为 x:DataType,但我真的不觉得那样一个很好的解决方案。而且,因为我确信许多其他项目将使用分组列表,所以我很想知道这种情况下的“最佳实践”是什么。
您可以尝试创建自己的分组。
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; }
从下面的link下载源文件。 https://github.com/jamesmontemagno/Xamarin.Forms-Monkeys
将组头模板上的数据类型设置为空:x:DataType="{x:Null}"
这将覆盖页面级数据类型并绕过 XAML 关于 Key 绑定的编译错误。将鼠标悬停在 Key 上仍然指示 "Member not found in data context" 但它编译正常,并且分组按预期工作(在我的例子中是 Syncfusion listview,但通用 listview 应该以相同的方式工作)。
好的,这应该很简单,但我卡住了。
我正在升级一个旧的 .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 设置有效的数据类型(因为模板中的绑定在 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>
我应该指定什么而不是 ????在前面的代码示例中?
作为变通方法,我创建了一个实现
您可以尝试创建自己的分组。
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; }
从下面的link下载源文件。 https://github.com/jamesmontemagno/Xamarin.Forms-Monkeys
将组头模板上的数据类型设置为空:x:DataType="{x:Null}"
这将覆盖页面级数据类型并绕过 XAML 关于 Key 绑定的编译错误。将鼠标悬停在 Key 上仍然指示 "Member not found in data context" 但它编译正常,并且分组按预期工作(在我的例子中是 Syncfusion listview,但通用 listview 应该以相同的方式工作)。