2016-11-17 38 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數據模板中打開新窗體,並使用bindable屬性將數據模板傳遞到您的視單元。在您的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耶:D工作和編輯我的答案.. –