【发布时间】:2018-07-25 16:40:53
【问题描述】:
我在ViewCell 中有一张图片,我在图片中添加了TapGestureRecognizer,现在当用户点击图片时,我想从数据ViewCell 访问数据
我该怎么做?
【问题讨论】:
标签: c# listview xamarin xamarin.forms
我在ViewCell 中有一张图片,我在图片中添加了TapGestureRecognizer,现在当用户点击图片时,我想从数据ViewCell 访问数据
我该怎么做?
【问题讨论】:
标签: c# listview xamarin xamarin.forms
这是在 ViewCell 上传递数据的简单代码。
代码 UI--
<ListView ItemsSource="{Binding ListItem}" x:Name="lst">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Image Source="abcd" Aspect="AspectFit">
<Image.GestureRecognizers>
<TapGestureRecognizer Command="{Binding ClickCommand}"
Source={x:Reference lst}}"
CommandParameter="{Binding .}" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
代码视图模型--
Public Class MainViewModel
{
Command clickCommand;
public Command ClickCommand
{
get
{
return clickCommand ?? (menuTapCommand = new Command<Object>(GetImage));
}
}
Private Void GetImage(Object obj)
{
//Todo
}}
【讨论】:
当为 XF ViewCell 创建 DataTemplate 时,该图像的 BindingContext 和单元格本身就是 Data 对象。我有一个带有图像和 TapGestureRecognizer 的 ViewCell。它在我有所需数据的 Data 对象中正确执行ICommand。您需要在提供给 ListView 的数据对象中使用 ICommand。
<ListView ItemsSource="{Binding ListItem}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Image Source="abcd">
<Image.GestureRecognizers>
<TapGestureRecognizer Command="{Binding ClickCommand}" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
ListView 的 Data 对象应具有ICommand。
public class MyDataObject
{
private Action<string> _openUrl;
private string _url;
public MyDataObject(string url, Action<string> openUrl)
{
_url = url;
_openUrl = openUrl;
ClickCommand = new Command(AccessOtherData);
}
public ICommand ClickCommand { get; }
// Other data properties and such
private void AccessOtherData()
{
// Call method to open _url
_openUrl(_url);
}
}
您的页面 ViewModel 中的 ObservableCollection 应该有一个 Data 对象列表
视图模型:
public class ViewModel
{
public event EventHandler<string> OpenUrl;
// List filled with the MyDataObject
public ObservableCollection<MyDataObject> Collection { get; set; }
private void FillCollection()
{
// Create all MyDataObjects here
// Each object will be created like this
Collection.Add(new MyDataObject("insert url here", OpenUrlFromObject));
}
private void OpenUrlFromObject(string url)
{
OpenUrl?.Invoke(this, url); // Subscribe to this event in your Page and open
}
}
【讨论】:
MyDataObject 关联的数据,只要单击图像并从执行的命令中运行AccessOtherData 方法即可.您使用 Data 在正确的对象中。
MyDataObject 列表时,您应该为列表中的每个对象提供稍后需要的信息。然后,一旦您的图片被点击,您将获得正确的数据,并且您处于一个特定的MyDataObject。