【问题标题】:Access list data from tapgesture from image inside viewcell从 viewcell 内的图像中的 tapgesture 访问列表数据
【发布时间】:2018-07-25 16:40:53
【问题描述】:

我在ViewCell 中有一张图片,我在图片中添加了TapGestureRecognizer,现在当用户点击图片时,我想从数据ViewCell 访问数据

我该怎么做?

【问题讨论】:

    标签: c# listview xamarin xamarin.forms


    【解决方案1】:

    这是在 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
    }}
    

    【讨论】:

    • 感谢您的回复,但 tapGestureRecognizer 没有 Source 属性。
    • 是的,这只是提示。您可以像这样使用 -
    • 现在解决了,在viewmodel menuTapCommand给我一个错误,为什么?
    • 有什么错误,请您发布详细信息,如果解决请投票
    • 检查您使用的是在 Viewmodel 中提供的同名“menuTapCommand”。看起来viewmodel中没有menuTapCommand
    【解决方案2】:

    当为 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
        }
    }
    

    【讨论】:

    • 好的,现在我如何获取数据?我想点击图片,获取数据,然后他们打开数据上的 url。
    • 如果您想要与MyDataObject 关联的数据,只要单击图像并从执行的命令中运行AccessOtherData 方法即可.您使用 Data 在正确的对象中。
    • 当您创建MyDataObject 列表时,您应该为列表中的每个对象提供稍后需要的信息。然后,一旦您的图片被点击,您将获得正确的数据,并且您处于一个特定的MyDataObject
    • 可以举个例子吗?
    • 我编辑了我的答案,更改了在数据对象中显示 url 并将其传播回您的 UI 以便打开它。
    猜你喜欢
    • 2016-11-02
    • 2023-03-14
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2016-02-17
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多