C# 如何使用xaml在ListView中水平显示值?

C# 如何使用xaml在ListView中水平显示值?,c#,xaml,xamarin,xamarin.forms,C#,Xaml,Xamarin,Xamarin.forms,我试图在ListView中显示一组值 Listview.Xaml <ListView x:Name="itemsource" > <ListView.ItemTemplate> <DataTemplate> <ViewCell IsEnabled="False">

我试图在ListView中显示一组值

Listview.Xaml

 <ListView x:Name="itemsource" >
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell IsEnabled="False">
                                    <ViewCell.View>
                                    <StackLayout>
                                            <Label Text="{Binding Value1}"/>
                                            <Label Text="{Binding Value2}"/>
                                    </StackLayout>
                                    </ViewCell.View>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>

我已经为水平listView创建了自定义控件,它对我很好。在xamarin中没有水平列表视图选项。这是完整的代码

public class HorizontalList : Grid
    {
        protected readonly ICommand SelectedCommand;
        protected readonly StackLayout ItemsStackLayout;

        public event EventHandler SelectedItemChanged;

        public static StackOrientation ListOrientation { get; set; }

        public HorizontalList()
        {
            SelectedCommand = new Command<object>(item => {
                var selectable = item as ISelectable;
                if (selectable == null)
                    return;

                SetSelected(selectable);
                SelectedItem = selectable.IsSelected ? selectable : null;
            });

            ItemsStackLayout = new StackLayout
            {
                Orientation = StackOrientation.Horizontal,
                Padding =new Thickness(0, 0, 0, 0),
                Margin=new Thickness(0, 0, 0, 0),
                Spacing = 5,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions=LayoutOptions.FillAndExpand
            };
            Children.Add(ItemsStackLayout);
        }

        public static readonly BindableProperty CommandProperty =
            BindableProperty.Create<HorizontalList, ICommand>(p => p.Command, null);

        public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }

        public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create(
        propertyName: "ItemsSource",
        returnType: typeof(IEnumerable),
        declaringType: typeof(HorizontalList),
        defaultValue: null,
        defaultBindingMode: BindingMode.OneWay,
            propertyChanged: ItemsSourceChanged);



        //public static readonly BindableProperty ItemsSourceProperty =
        //BindableProperty.Create<HorizontalList, IEnumerable>(p => p.ItemsSource, default(IEnumerable<object>), BindingMode.TwoWay, null, ItemsSourceChanged);

        public static readonly BindableProperty SelectedItemProperty =
            BindableProperty.Create<HorizontalList, object>(p => p.SelectedItem, default(object), BindingMode.TwoWay, null, OnSelectedItemChanged);

            public static readonly BindableProperty ItemTemplateProperty = BindableProperty.Create(
            propertyName: "ItemTemplate",
            returnType: typeof(DataTemplate),
                declaringType: typeof(HorizontalList),
            defaultValue: default(DataTemplate));

        //public static readonly BindableProperty ItemTemplateProperty =
            //BindableProperty.Create<HorizontalList, DataTemplate>(p => p.ItemTemplate, default(DataTemplate));

        public IEnumerable ItemsSource
        {
            get { return (IEnumerable)GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty, value); }
        }

        public object SelectedItem
        {
            get { return (object)GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }

        public DataTemplate ItemTemplate
        {
            get { return (DataTemplate)GetValue(ItemTemplateProperty); }
            set { SetValue(ItemTemplateProperty, value); }
        }

        //private static void ItemsSourceChanged(BindableObject bindable, IEnumerable oldValue, IEnumerable newValue)
        //{
        //    var itemsLayout = (HorizontalList)bindable;
        //    itemsLayout.SetItems();
        //}

        private static void ItemsSourceChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var itemsLayout = (HorizontalList)bindable;
            itemsLayout.SetItems();
        }

        protected virtual void SetItems()
        {
            ItemsStackLayout.Children.Clear();

            if (ItemsSource == null)
                return;

            foreach (var item in ItemsSource)
                ItemsStackLayout.Children.Add(GetItemView(item));

            SelectedItem = ItemsSource.OfType<ISelectable>().FirstOrDefault(x => x.IsSelected);
        }

        protected virtual View GetItemView(object item)
        {
            var content = ItemTemplate.CreateContent();
            var view = content as View;
            if (view == null)
                return null;

            view.BindingContext = item;

            var gesture = new TapGestureRecognizer
            {
                Command = SelectedCommand,
                CommandParameter = item
            };

            AddGesture(view, gesture);

            return view;
        }

        protected void AddGesture(View view, TapGestureRecognizer gesture)
        {
            view.GestureRecognizers.Add(gesture);

            var layout = view as Layout<View>;

            if (layout == null)
                return;

            foreach (var child in layout.Children)
                AddGesture(child, gesture);
        }

        protected virtual void SetSelected(ISelectable selectable)
        {
            selectable.IsSelected = true;
        }

        protected virtual void SetSelectedItem(ISelectable selectedItem)
        {
            var items = ItemsSource;

            foreach (var item in items.OfType<ISelectable>())
                item.IsSelected = selectedItem != null && item == selectedItem && selectedItem.IsSelected;

            var handler = SelectedItemChanged;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }

        private static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var itemsView = (HorizontalList)bindable;
            if (newValue == oldValue)
                return;

            var selectable = newValue as ISelectable;
            itemsView.SetSelectedItem(selectable ?? oldValue as ISelectable);
        }

    }


    public interface ISelectable
    {
        bool IsSelected { get; set; }

        ICommand SelectCommand { get; set; }
    }
和UI-

<ScrollView Orientation="Horizontal" >
                      <customControls:HorizontalList 
                         ItemsSource="{Binding Listdata}" ListOrientation="Horizontal">
                                    <customControls:HorizontalList.ItemTemplate>
                                        <DataTemplate>
                                         <StackLayout>
                                           <Label Text="{Binding Value1}"/>
                                            <Label Text="{Binding Value2}"/> 
                                        </StackLayout>
                                        </DataTemplate>
                                    </customControls:HorizontalList.ItemTemplate>
                                </customControls:HorizontalList>
                    </ScrollView>

只需更改StackLayout的方向即可

<ListView x:Name="itemsource" >
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell IsEnabled="False">
                                        <ViewCell.View>
                                        <StackLayout  Orientation="Horizontal">
                                                <Label Text="{Binding Value1}"/>
                                                <Label Text="{Binding Value2}"/>
                                        </StackLayout>
                                        </ViewCell.View>
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>


这是最简单的方法。

为此,您必须使用自定义控件。或者你可以使用旋转视图。请检查此问题:可能重复我收到两个错误:错误CS0305:使用泛型类型“IEnumerable”需要1个类型参数错误CS0118:“View”是命名空间,但与类型一样使用
<ListView x:Name="itemsource" >
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell IsEnabled="False">
                                        <ViewCell.View>
                                        <StackLayout  Orientation="Horizontal">
                                                <Label Text="{Binding Value1}"/>
                                                <Label Text="{Binding Value2}"/>
                                        </StackLayout>
                                        </ViewCell.View>
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>