Listview DataTemplateSelector将参数传递给DataTemplate [英] Listview DataTemplateSelector pass parameter to DataTemplate

查看:62
本文介绍了Listview DataTemplateSelector将参数传递给DataTemplate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将ObservableCollection作为参数发送到我的自定义视单元,该视单元是通过DataTemplateSelector调用的.有什么想法吗?

I need to send the ObservableCollection as parameter to my custom viewcell, that is invoked through a DataTemplateSelector. Any ideas?

我想要的是在用户单击每个项目中包含的按钮时删除一个Listviewitem.

What I want is to remove one Listviewitem when the users clicks a button contained on each item.

这是TemplateSelector中的代码:

Here is the code in the TemplateSelector:

private readonly DataTemplate templateOne;
private readonly DataTemplate templateTwo;

public ItemTemplateSelect(ObservableCollection<Item> _items)
{
    templateOne = new DataTemplate(typeof(TemplateOneCell));
    templateTwo = new DataTemplate(typeof(TemplateTwoCell));
}

protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
    if (((Item)item).status == -1)
    {
        return templateOne; <---- Here I want to send '_items' as parameter
    }
    else
    {
        return templateTwo;
    }
}

这是我的视单元的一个例子:

Here is an example of my viewcell:

public class ContactCell : ViewCell
{
    public ContactCell()
    {
        var okButton = new Button()
        {
            Text = "OK"
        };
        okButton.Clicked += okButton_Clicked;

        var frame = new Frame
        {
            Padding = 0,
            Margin = 0,
            Content = okButton
        };

        View = frame;
    }

    private async void okButton_Clicked(object sender, EventArgs e)
    {
        -------------> delete current item
    }
}

谢谢.

推荐答案

问题是,如果您知道使用静态值,则不能使用Navigation.pushasync函数.因此,我将为您提供示例,并提供没有静态值的示例.但是我不知道这是否是做事的最短方法.我要做的是创建所选对象的实例和一个函数,该函数将在listview数据模板中打开新表单,并使用bindableproperty将数据模板传递给您的viewcell.在您的视单元中,在按钮的clickevent中调用(数据模板的)函数.

The thing is that if you use static values as you know we cant use Navigation.pushasync function. So i will give you and example how to do without static values. But i dont know if it is the shortest way to do things. What i do is create an instance of your selected object and a function that will open new form in your listview datatemplate and pass datatemplate to your viewcell using bindableproperty. In your viewcell call the function (of datatemplate) in clickevent of your button..

将您的商品想象为

class myobject
{
...
}

并创建您的列表视图

public class mylistviewTemplate:ListView
{
 public mylistviewTemplate()
 {
   ...
   DataTemplate cell = new DataTemplate (typeof(myobjectcellview));
   cell.SetValue(myobjectcellview.myClickedObject,this);
 }
 public void tapped(myobject item)
{

    Navigation.PushAsync (new myobjectDetailPage (item));
}
...

在您的单元格视图中

public class myobjectcellview:ViewCell
{
public static readonly BindableProperty myClickedObject = 
BindableProperty.Create<myobjectcellview, mylistviewTemplate>(bip => bip.obj, null);

    public mylistviewTemplate obj
    {
        get {return (mylistviewTemplate)GetValue(myClickedObject);}
        set {SetValue(myClickedObject, value);}
    }
    public myobjectcellview()
    {
      Button btn = new Button();
      btn.Clicked += (sender, e) =>
         {
            if (obj != null)
            {
                var ctx = (myobject)this.BindingContext;
                obj.tapped(ctx as myobject);    
            }
        };
      this.View = new StackLayout{...};
    }

这篇关于Listview DataTemplateSelector将参数传递给DataTemplate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆