Xamarin:CollectionView 列触发不同的操作

Xamarin: CollectionView columns to trigger different actions

我在 XAML 中有这个:

<CollectionView ItemsSource="{Binding Accepted}" 
                            SelectionMode="Single" SelectionChanged="OnAcceptedSelected">
         <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Label Text="{Binding friendlyname}"/>
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
         </CollectionView>

这是 OnClick 处理程序:

async void OnAcceptedSelected(object sender, SelectionChangedEventArgs e) {
            MyItem selectedMI = e.CurrentSelection.FirstOrDefault() as MyItem; 
            // do something
        }

我希望能够根据用户单击的列对 selectedMI 执行不同的操作,如下所示:

<CollectionView ItemsSource="{Binding Accepted}" 
                            SelectionMode="Single" SelectionChanged="OnAcceptedSelected">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Label Text="{Binding friendlyname}"/>
                            <Label x:Name="Action_A" />
                            <Label x:Name="Action_B" />
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

这样我就可以做这样的事情了:

async void OnAcceptedSelected(object sender, SelectionChangedEventArgs e) {
            MyItem selectedMI = e.CurrentSelection.FirstOrDefault() as MyItem;
            // if clicked on Action_A do something and
            // if clicked on Action_B do something else
        }

Xamarin 似乎没有提供明显的方法来做到这一点。任何想法如何实现此功能? 谢谢

给Label添加手势是个不错的选择。

我写了一个小例子供大家参考。

在CollectionView的每一行添加两个标签,分别绑定两个事件。点击不同的标签会进入两个不同的方法,在方法内部可以获取到你点击的标签的信息。

这里是 xaml 代码:

<CollectionView ItemsSource="{Binding Accepted}" >
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <StackLayout>
                <Label  Text="{Binding .}" BackgroundColor="Red" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                    <Label.GestureRecognizers>
                        <TapGestureRecognizer Tapped="tapCommand"/>
                    </Label.GestureRecognizers>
                </Label>
                <Label  Text="{Binding .}" BackgroundColor="blue" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                    <Label.GestureRecognizers>
                        <TapGestureRecognizer Tapped="tapCommand1"/>
                    </Label.GestureRecognizers>
                </Label>
            </StackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

后台代码如下:

public partial class MainPage : ContentPage
{
    public ObservableCollection<string> Accepted { get; set; }
    public MainPage()
    {
        Accepted = new ObservableCollection<string>();
        Accepted.Add("aaa");
        Accepted.Add("bbb");
        Accepted.Add("ccc");//Simulation data
        InitializeComponent();
        BindingContext = this;
    }
    private void tapCommand(object sender, EventArgs e)//event1
    {
        string res = (sender as Label).Text;
    }

    private void tapCommand1(object sender, EventArgs e)//event2
    {
        string res = (sender as Label).Text;
    }
}