2016-06-09 88 views
5

現在我試圖讓一個ListView有一些可綁定的CustomCells。我將XAML中的單元定義爲ListView.ItemTemplate下的DataTemplate下的ViewCell。Xamarin表單列表視圖綁定

讓我們簡單地說,我有兩個字符串,我代表在單元格中。 ViewCell看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="simpletest.MyPage2"> 
    <ContentPage.Content> 
     <StackLayout Spacing="10" x:Name="layout" Padding="8,10"> 
      <Label Text="{Binding Something}" /> 
      <ListView x:Name="listView"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <ViewCell> 
          <StackLayout Orientation="Horizontal"> 
           <Label Text="{Binding Name}" /> 
           <Label Text="{Binding Price}" /> 
          </StackLayout> 
         </ViewCell> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </StackLayout> 
    </ContentPage.Content> 
</ContentPage> 

我真的很希望保留在XAML中。我不喜歡用C#編寫整個事情來把它變成一個膨脹的世界。

我有這個頁面的ViewModel,我在代碼背後的文件中設置綁定上下文。我的問題如下,我是否定義了一個在C#中擴展ViewCell以綁定數據的類?如前所述,我不想在C#中定義佈局。我想以這種方式進行綁定。我想避免引用這些字段,因爲代碼背後的文件傾向於引用組件。這可能嗎?我檢查了Xamarin網站,該示例使用了混合代碼和XAML(如果我正確解釋它)。

編輯1:

我試着寫,模仿一些例子文件,但這是遠遠不夠的。沒有一段代碼可以解釋這個文件是代表XAML中ViewCell的文件,並且沒有明顯的方式讓我填充列表而不訪問代碼隱藏中的列表字段。如果我只是想使用綁定將一些項目添加到此列表中,我錯過了什麼?

public class ReportedAssignmentCell : ViewCell 
{ 
    public ReportedAssignmentCell() 
    { 
    } 

    public static readonly BindableProperty NameProperty = BindableProperty.Create("Name", typeof(string), typeof(ReportedAssignmentCell), ""); 
    public static readonly BindableProperty PriceProperty = BindableProperty.Create("Price", typeof(string), typeof(ReportedAssignmentCell), ""); 



    public string Name 
    { 
     get { return (string)GetValue(NameProperty); } 
     set { SetValue(NameProperty, value); } 
    } 
    public string Price 
    { 
     get { return (string)GetValue(PriceProperty); } 
     set { SetValue(NameProperty, value); } 
    } 
} 
+0

你寫的代碼應該工作正常。如果你想擴展或定製一個'ViewCell',那麼你可以用C#代碼擴展它,並在你的XAML中引用它,但是你並不需要並且可以完全按照你以前所做的來做。你有特定的問題嗎? – hvaughan3

+0

我想我在這裏誤解了一些根本性的東西。我不知道如何引用該文件,你建議這應該在標籤中完成?我也不瞭解我如何填充列表。我更新了我的問題,使其更加明顯。 –

+0

看到我的答案,並讓我知道如果你仍然有問題 – hvaughan3

回答

5

您需要將ListView小號ItemSource屬性設置爲項目的列表。該項目列表應包含在您的視圖中。事情是這樣的:

<ListView ItemSource="{Binding ListOfItems}" ...> 
... 
</ListView> 

然後在您的視圖模型:

private ObservableCollection<ItemModel> _listOfItems; 
public ObservableCollection <ItemModel> ListOfItems { 
    get { return _listOfItems ?? _listOfItems == new ObservableCollection<ItemModel>; } 
    set { 
     if(_listOfItems != value) { 
      _listOfItems = value; 
      SetPropertyChanged(); 
     } 
    } 

現在,如果你想使用自定義的ReportedAssignmentCell你可以,但你也可以只留下StackLayoutLabels在那裏。嘗試設置ItemSource,就像我上面所描述的那樣,使用您發佈的當前ListView XAML並查看是否會給您提供您正在尋找的效果。如果沒有,請告訴我。

A ViewCell是爲了容納其他物品,如StackLayout s和Labels。它但不必包含那些Label將要綁定的所有屬性。綁定從ListView.ItemSource傳遞到您的ListView.ItemTemplate。該綁定不需要ViewCell具有綁定工作的任何特殊屬性。我希望這是有道理的。如果不讓我知道什麼不對。

+0

謝謝,你真的救了我。 –

+0

@why_vincent絕對樂意幫忙 – hvaughan3