如果您是Xamarin.Forms开发人员,那么您很可能遇到了内置ListView
的问题。使用 DataTemplate 绑定 ItemsSource ,使用简单的转发器会不会更容易?这就是我的想法。
在SL / WPF中有一个ItemsControl
就像那样 - 没有设计,没有选择,只是重复项目。
现在XLabs中有一个,但是如果你不想要所有的软件包,这里有一个更简单的解决方案,基于QiMata的this article。
工具:
答案 0 :(得分:7)
在Xamarin.Forms PCL项目中创建一个新类。我将我的名字命名为 HliItemsView (因为“View”是XF中“Controls”的术语,而Hli是我的品牌)。
粘贴此代码并根据需要进行修改。
我的观点基于ScrollView
,因为它是一个列表。这样,项目就会像ListView
一样自动滚动。
using System;
using System.Collections;
using Xamarin.Forms;
namespace HLI.Forms.Controls
{
public class HliItemsView : ScrollView
{
public static readonly BindableProperty ItemTemplateProperty = BindableProperty.Create(
"ItemTemplate",
typeof(DataTemplate),
typeof(HliItemsView),
null,
propertyChanged: (bindable, value, newValue) => Populate(bindable));
public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create(
"ItemsSource",
typeof(IEnumerable),
typeof(HliItemsView),
null,
BindingMode.OneWay,
propertyChanged: (bindable, value, newValue) => Populate(bindable));
public IEnumerable ItemsSource
{
get
{
return (IEnumerable)this.GetValue(ItemsSourceProperty);
}
set
{
this.SetValue(ItemsSourceProperty, value);
}
}
public DataTemplate ItemTemplate
{
get
{
return (DataTemplate)this.GetValue(ItemTemplateProperty);
}
set
{
this.SetValue(ItemTemplateProperty, value);
}
}
private static void Populate(BindableObject bindable)
{
var repeater = (HliItemsView)bindable;
// Clean
repeater.Content = null;
// Only populate once both properties are recieved
if (repeater.ItemsSource == null || repeater.ItemTemplate == null)
{
return;
}
// Create a stack to populate with items
var list = new StackLayout();
foreach (var viewModel in repeater.ItemsSource)
{
var content = repeater.ItemTemplate.CreateContent();
if (!(content is View) && !(content is ViewCell))
{
throw new Exception($"Invalid visual object {nameof(content)}");
}
var view = content is View ? content as View : ((ViewCell)content).View;
view.BindingContext = viewModel;
list.Children.Add(view);
}
// Set stack as conent to this ScrollView
repeater.Content = list;
}
}
}
答案 1 :(得分:0)
WPF 中的 Xaml 和 Xamarin 之间存在一些差异,您可以看到 here。
但是有一个 ItemsControl 示例实现(源代码),功能齐全,来自 Xamarin GitHub 存储库,您可以找到 here。
示例用法如下:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
...
xmlns:local="clr-namespace:YourNameSpaceHere"
...
然后像这样实例化 ItemsControls:
<local:ItemsControl x:Name="CardsPicked" ItemsSource="{Binding Path=Deck.CardsPicked, Mode=TwoWay}" Grid.Row="3" Orientation="Horizontal" HorizontalOptions="Center" >
<local:ItemsControl.ItemTemplate>
<DataTemplate>
<Image Source="{Binding CardType, Converter={StaticResource CardTypeImageConverter}}" MinimumHeightRequest="140" Aspect="AspectFit" Margin="4"></Image>
</DataTemplate>
</local:ItemsControl.ItemTemplate>
</local:ItemsControl>