C# Xamarin.forms如何在列表中显示相邻的项目

C# Xamarin.forms如何在列表中显示相邻的项目,c#,xaml,xamarin,xamarin.forms,.net-standard-2.0,C#,Xaml,Xamarin,Xamarin.forms,.net Standard 2.0,我目前正在使用Xamarin.Forms和.Net标准共享策略开发一个应用程序。一切都在共享项目中完成。(没有设备指定设计) 我尝试将对象列表绑定到listview。我已经用ItemsSource=“{Binding Items}”显示/填充列表,所选项目也绑定到列表视图SelectedItem=“{Binding SelectedApp}”。 每个列表项都可视化为一个带有图像和标题的框架。 通过使用数据模板 我试图实现的是使我的listview看起来像一个“类似Google PlayStore

我目前正在使用Xamarin.Forms和.Net标准共享策略开发一个应用程序。一切都在共享项目中完成。(没有设备指定设计)

我尝试将对象列表绑定到listview。我已经用
ItemsSource=“{Binding Items}”
显示/填充列表,所选项目也绑定到列表视图
SelectedItem=“{Binding SelectedApp}”
。 每个列表项都可视化为一个带有图像和标题的框架。 通过使用数据模板

我试图实现的是使我的listview看起来像一个“类似Google PlayStore的列表”:

显示彼此相邻的项目。 当水平方向上没有剩余位置时,下一个项目将显示在下一行。该列表会自动将项目调整为可用的。 这样,当从纵向切换到横向时,列表的屏幕响应性更好

我的问题是,如何在此结构中显示列表? 然而,这将是很好的,材料设计卡设计不是这个问题的一部分

这个问题描述了一个类似于我的问题——我想成为什么样的人。 希望我开发的是Xamarin应用程序,而不是原生(java)Android应用程序:

有一个名为
FlowListView的控件(请参阅)

只需添加NuGet包并从XAML添加视图

<flv:FlowListView FlowColumnCount="3" FlowItemsSource="{Binding Items}">
    <flv:FlowListView.FlowColumnTemplate>
        <DataTemplate>
            <StackLayout>
                <Image Source="{Binding Image}" />
                <Label Text="{Binding Type}" />
                <Label Text="{Binding Name}" FontSize="Small" />
                <local:Rating Value="{Binding Rating}" />
            </StackLayout>
        </DataTemplate>
    </flv:FlowListView.FlowColumnTemplate>
</flv:FlowListView>

这假设我们已将
x:Name=“FlowListView
添加到out
FlowListView
。更好的方法是根据实际宽度计算列数,但我认为您已经掌握了要点。

有一个名为
FlowListView
的控件(请参阅)

只需添加NuGet包并从XAML添加视图

<flv:FlowListView FlowColumnCount="3" FlowItemsSource="{Binding Items}">
    <flv:FlowListView.FlowColumnTemplate>
        <DataTemplate>
            <StackLayout>
                <Image Source="{Binding Image}" />
                <Label Text="{Binding Type}" />
                <Label Text="{Binding Name}" FontSize="Small" />
                <local:Rating Value="{Binding Rating}" />
            </StackLayout>
        </DataTemplate>
    </flv:FlowListView.FlowColumnTemplate>
</flv:FlowListView>

这假设我们已经将
x:Name=“FlowListView
添加到out
FlowListView
。更好的方法是根据实际宽度计算列数,但我想你已经掌握了要点。

我可以确认,滚动将在不添加
ScrollView
的情况下工作。Paul Kertscher的建议非常有用,几乎就是我想要的,但是这个解决方案仍然存在一些问题。1.我和MVVM一起工作。listview中的selectedItem与该页面VM的对象/属性绑定。当我从FlowListView中选择一个项目时,数据绑定将不再工作。2.根据您的回答,FlowColumnCount固定为3。我想做的是,只要通过扩展窗口有足够的空间,就显示一个额外的项目(增加FlowColumnCount)。如果缩小窗口没有足够的空间,则必须减少FlowColumnCount。@约翰:关于第1点:我真的不明白,为什么数据绑定不能工作。您拥有可以绑定到VM的
FlowLastTappedItem
属性。(看)@PaulKertscher:谢谢,我就快到了。第二点解决了,我使用了SelectedItem,这是错误的。当我在代码隐藏中执行您的解决方案时,一切都正常!但是,我需要尊重MVVM框架,这意味着我不应该在代码隐藏中键入代码,而应该在该页面的ViewModel(VM)中键入代码。在ViewModel中,我无法访问列表flowListView(元素名称),也无法获取页面/视图、宽度;当我能够在MVVM模式方面获得相同的结果时,没有代码落后,我的问题就真正解决了。约翰:MVVM中的虚拟机不应该对某些东西的显示方式负责(至少不应该在那么低的级别上),而应该对显示的内容负责。拥有纯粹与演示相关的代码不应该是您的虚拟机的问题,而应该是您的视图的问题。我可以确认,滚动将在不添加
ScrollView
的情况下工作。Paul Kertscher的建议非常有帮助,几乎就是我想要的,但是这个解决方案仍然存在一些问题。1.我和MVVM一起工作。listview中的selectedItem与该页面VM的对象/属性绑定。当我从FlowListView中选择一个项目时,数据绑定将不再工作。2.根据您的回答,FlowColumnCount固定为3。我想做的是,只要通过扩展窗口有足够的空间,就显示一个额外的项目(增加FlowColumnCount)。如果缩小窗口没有足够的空间,则必须减少FlowColumnCount。@约翰:关于第1点:我真的不明白,为什么数据绑定不能工作。您拥有可以绑定到VM的
FlowLastTappedItem
属性。(看)@PaulKertscher:谢谢,我就快到了。第二点解决了,我使用了SelectedItem,这是错误的。当我在代码隐藏中执行您的解决方案时,一切都正常!但是,我需要尊重MVVM框架,这意味着我不应该在代码隐藏中键入代码,而应该在该页面的ViewModel(VM)中键入代码。在ViewModel中,我无法访问列表flowListView(元素名称),也无法获取页面/视图、宽度;当我能够在MVVM模式方面获得相同的结果时,没有代码落后,我的问题就真正解决了。约翰:MVVM中的虚拟机不应该对某些东西的显示方式负责(至少不应该在那么低的级别上),而应该对显示的内容负责。拥有纯粹与表示相关的代码不应该是VM的问题,而应该是您的观点。