Xamarin Forms - 在调用事件时将自定义单元格绑定到原始列表视图项目源 "ItemSelected"

Xamarin Forms - Make custom cell bind to original listview itemsource when calling event "ItemSelected"

我四处搜索,但我认为我找不到问题的答案。我是 xamarin 的新手,所以我希望我使用的是正确的术语。我正在试验列表视图中的自定义单元格。我的目标是在我的应用程序的多个部分重复使用自定义单元格,但是当我使用事件“ItemSelected”时,它返回到自定义单元格的绑定,而不是我原来的列表视图项目源绑定。我明白我为什么这么想,但我不确定如何将 ItemSelected 绑定到原始来源。我在这里使用正确的方法吗?老实说我完全迷路了。

这是我的自定义手机代码:

public partial class ListCell : ViewCell
    {
        public static readonly BindableProperty LabelHeaderProperty = BindableProperty.Create("LabelHeader", typeof(string), typeof(ListCell));
        public string LabelHeader
        {
            get { return (string)GetValue(LabelHeaderProperty); }
            set { SetValue(LabelHeaderProperty, value); }
        }
        public static readonly BindableProperty LabelSmallProperty = BindableProperty.Create("LabelSmall", typeof(string), typeof(ListCell));
        public string LabelSmall
        {
            get { return (string)GetValue(LabelSmallProperty); }
            set { SetValue(LabelSmallProperty, value); }
        }
        public ListCell()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();

            BindingContext = new
            {
                LabelHeader = this.LabelHeader,
                LabelSmall = this.LabelSmall
            };
        }
    }

这是我的 ListView

<ListView x:Name="MyListView"
                ItemsSource="{Binding Items}"
                VerticalOptions="FillAndExpand"
                HasUnevenRows="true"
                IsPullToRefreshEnabled="true"
                ItemSelected="OnItemSelected"
                SeparatorVisibility="None">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <extensions:ListCell LabelHeader="{Binding Description}"
                                         LabelSmall="{Binding Description}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

非常感谢您:)

根据您的代码,当绑定到自定义单元格类型的 BindableProperty 实例时,显示 BindableProperty 值的 UI 控件应使用 OnBindingContextChanged 覆盖来设置每个单元格中要显示的数据。

 public class ListCell:ViewCell
{
    Label headerLabel, smallLabel;
    public static readonly BindableProperty LabelHeaderProperty = BindableProperty.Create("LabelHeader", typeof(string), typeof(ListCell),"name");
    public string LabelHeader
    {
        get { return (string)GetValue(LabelHeaderProperty); }
        set { SetValue(LabelHeaderProperty, value); }
    }
    public static readonly BindableProperty LabelSmallProperty = BindableProperty.Create("LabelSmall", typeof(string), typeof(ListCell),"small label");
    public string LabelSmall
    {
        get { return (string)GetValue(LabelSmallProperty); }
        set { SetValue(LabelSmallProperty, value); }
    }

    public ListCell()
    {
        StackLayout stack = new StackLayout { Orientation=StackOrientation.Horizontal};
        headerLabel = new Label { FontAttributes = FontAttributes.Bold };
        smallLabel = new Label();
        stack.Children.Add(headerLabel);
        stack.Children.Add(smallLabel);
        View = stack;
    }
    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();

        if (BindingContext != null)
        {
            headerLabel.Text = LabelHeader;
            smallLabel.Text = LabelSmall;
           
        }
    }
}

 <ListView
            x:Name="listView"
            ItemSelected="listView_ItemSelected"
            ItemsSource="{Binding items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <local:ListCell LabelHeader="{Binding Name}" LabelSmall="{Binding description}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

但是您可以直接在ListView的DataTemplate中使用TextCell,不需要创建自定义viewcell。

<ListView ItemsSource="{Binding items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextCell Detail="{Binding description}" Text="{Binding name}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

关于TextCell的使用,可以看看:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/data-and-databinding#binding-cells