2016-11-17 2 views
0

Мне нужно отправить параметр ObservableCollection как параметр в свою собственную ячейку просмотра, которая вызывается через DataTemplateSelector. Есть идеи?Listview DataTemplateSelector передать параметр DataTemplate

Я хочу удалить один Listviewitem, когда пользователи нажимают кнопку, содержащуюся на каждом элементе.

Вот код в 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; 
    } 
} 

Вот пример моего 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 
    } 
} 

Спасибо заранее.

+0

В общем, вы не проходите элемент. Вы используете привязку данных к значениям атрибутов. Можете ли вы привести мне пример вашего вида клетка? –

+0

Хорошо, я обновил сообщение с помощью моего примера с образцом. Все это связано с тем, что я не знаю, как обрабатывать событие okButton_Clicked из родительской формы. – Jose

+0

То, что я понимаю, это то, что у вас есть список, и каждый элемент в нем содержит кнопку удаления ... и когда нажата кнопка «Удалить», которую вы хотите удалить? Или вы хотите изменить datatemplate? –

ответ

0

Дело в том, что если вы используете статические значения, как вы знаете, мы не можем использовать функцию Navigation.pushasync. Поэтому я дам вам и пример, как обойтись без статических значений. Но я не знаю, если это самый короткий способ сделать что-то. Что я делаю, это создать экземпляр выбранного вами объекта и функцию, которая откроет новую форму в вашей таблице данных listview и передаст datatemplate на ваш элемент view с использованием bindableproperty. В ваших viewcell вызов функции (из DataTemplate) в clickevent вашей кнопки ..

Представьте ваш деталь как

class myobject 
{ 
... 
} 

и создать свой ListView

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)); 
} 
... 

И в вашем cellview

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{...}; 
    } 
+1

Может, так? var ctx = (Item) this.BindingContext; Позвольте мне проверить ваш код;) – Jose

+0

Хорошо скажите мне, если это сработает .. Спасибо .. –

+0

Я тестировал и работает в cellview yay: D и отредактировал мой ответ .. –

Смежные вопросы